一、介紹UIPickView和UIDatePicker
1.UIPickView什么時(shí)候用?
?通常在注冊(cè)模塊,當(dāng)用戶(hù)需要選擇一些東西的時(shí)候,比如說(shuō)城市,往往
彈出一個(gè)PickerView給他們選擇蚀同。?老虎機(jī)效果
2.UIPickView常見(jiàn)用法,演示實(shí)例程序1>獨(dú)立的,沒(méi)有任何關(guān)系=>菜單系統(tǒng)。2>相關(guān)聯(lián)的,下一列和第一列有聯(lián)系=>省會(huì)城市選擇3>圖文并帽,=>國(guó)旗選擇叉存。
3.UIPickView
4.UIDatePicker什么時(shí)候用?當(dāng)用戶(hù)選擇日期的時(shí)候,一般彈出一個(gè)UIDatePicker給用戶(hù)選擇撑毛。
5.UIDatePickerios6和ios7的區(qū)別
二恋脚、點(diǎn)餐系統(tǒng)PickerView(熟悉)
1.搭建界面
? ? ?1>注意點(diǎn):PickerView的高度不能改,默認(rèn)162,PickerView里面每行的高度
? ? ? ? ? 可以改,不要弄混淆了恋腕。
2.pickerView顯示數(shù)據(jù)
? ? ?1>如何使用PickerView展示數(shù)據(jù)?
? ? ? ? ? 進(jìn)入PickerView頭文件,有數(shù)據(jù)源和代理,聯(lián)想到UITableView,模仿UITableView的用法抹锄。
? ? ? 2>讓控制器作為PickerView的數(shù)據(jù)源,控制器遵守PickerView的數(shù)據(jù)源方法
? ? ? ? ? ?2.1>兩種方式:1.拖線(xiàn)2.代碼
? ? ? ? ? ?2.2>系統(tǒng)自帶的控件,數(shù)據(jù)源和代理屬性不需要IBOutlet,也能拖
? ? ? ? ? ? ? ? ? ?線(xiàn)。自己的屬性,想要拖線(xiàn),必須寫(xiě)IBOutlet荠藤。
? ? ? 3> PickerView的數(shù)據(jù)源方法
? ? ? ? ? ? ? ? 1> numberOfComponentsInPickerView:返回多少列
? ? ? ? ? ? ? ? 2> pickerView:numberOfRowsInComponent:返回第component列有多少行 ? ? ?
? ? ? ? ? ? ? ? 3>和UITableView的區(qū)別,每一行長(zhǎng)什么樣,是由PickerView的代理決定的伙单。
? ? ? ? ? ? ? ? 4>注意:如果沒(méi)有返回每一行長(zhǎng)什么樣子,每行就會(huì)顯示?,看見(jiàn)?,就
? ? ? ? ? ? ? ? ? ? ?知道沒(méi)有實(shí)現(xiàn)每一行長(zhǎng)什么樣子的方法。
? ? ? 4> PickerView的代理方法
1>返回第component列第row行長(zhǎng)什么樣哈肖。
第component列第row行的展示標(biāo)題
- (NSString*)pickerView:(UIPickerView*)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component
第component列第row行帶屬性的標(biāo)題
- (NSAttributedString*)pickerView:(UIPickerView*)pickerView
attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)
component
第component列第row行展示的視圖
- (UIView*)pickerView:(UIPickerView*)pickerView
viewForRow:(NSInteger)row forComponent:(NSInteger)component
reusingView:(UIView*)view;
2>返回第component列每一行的高度和寬度
- (CGFloat)pickerView:(UIPickerView*)pickerView
- (UIView*)pickerView:(UIPickerView*)pickerView
viewForRow:(NSInteger)row forComponent:(NSInteger)component
reusingView:(UIView*)view;
2>返回第component列每一行的高度和寬度
- (CGFloat)pickerView:(UIPickerView*)pickerView
widthForComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView*)pickerView
rowHeightForComponent:(NSInteger)component;
3>選中第component列第row行調(diào)用
- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row
inComponent:(NSInteger)component;
3.加載plist數(shù)據(jù)
? ?1>分析數(shù)據(jù)結(jié)構(gòu)
? ? ? ? ?1>大數(shù)組元素個(gè)數(shù):多少列?
? ? ? ? ?2>大數(shù)組里面的小數(shù)組:這一列有多少行吻育。
? ? ? ? ?3>小數(shù)組里的字符串:每行展示的樣子
?4.處理菜單選中業(yè)務(wù)
? ? ? ? 1>選中某一列某一行,顯示出來(lái)
? ? ? ? 2>拖動(dòng)不同列,改變不同的label,拖動(dòng)第一列改變水果。
? ? ? ? 3>判斷拖動(dòng)哪一列,改變對(duì)應(yīng)的label
? ? ? ? 4>在viewDidLoad中初始化label顯示
? ? ? ? ?5>取出數(shù)組中的數(shù)據(jù)給label直接賦值_fruitLabel.text=self.foots[0][0];這種方式不好,如果以后數(shù) ? ? ? ? ? ? ? 組里有很多數(shù)據(jù),要寫(xiě)很多行牡彻。
? ? ? ? ?6>還有另外一種方式,通過(guò)調(diào)用代理,給label賦值.唯一不同的,就是列
? ? ? ? ? ? ? 數(shù),搞個(gè)for循序就好了扫沼。
5.隨機(jī)選中某一列的某一行
? ? ? ? 1>如何選中某一行[self.pickerView selectRow:row inComponent:componentanimated:YES];
? ? ? ? 2>先隨機(jī)選中第0列的某一行,隨機(jī)數(shù)取值范圍看第0列總共有多少行,arc4random_uniform(x)隨機(jī) ? ? ? ? ? ? 0~x-1的數(shù)
? ? ? ? ?3>避免隨機(jī)出來(lái)的行數(shù)都一樣,需要判斷下,隨機(jī)出來(lái)的行數(shù)和當(dāng)前選中的是否一樣,一樣就重新隨機(jī), ? ? ? ? ? ? ? 用while判斷,直到隨機(jī)到不一樣,才行。
? ? ? ? ?4>問(wèn)題:label沒(méi)有顯示最新選中的一行庄吼。
? ? ? ? ? ? ? 原因:手動(dòng)調(diào)用pickview滾動(dòng),選中某一行,不會(huì)觸發(fā)代理,我們自己主動(dòng)調(diào)用代理,讓lebel顯示選中 ? ? ? ? ? ? ? ?哪一行.
? ? ? ? ? ? ? ?注意:只有用戶(hù)手動(dòng)滾動(dòng)才可以觸發(fā)pickview的代理方法。
? ? ? ? ?5>每一列都要隨機(jī)選中,弄個(gè)for循 ? ? ? ? ? ? ? ? ? 序,遍歷每一列都隨機(jī)選中
三严就、選擇國(guó)旗(熟悉)
1.搭建界面
2.設(shè)置pickerView的數(shù)據(jù)源3.分析有多少列,只有一列,因?yàn)槭俏淖趾蛨D片是同時(shí)滾動(dòng),如果兩列的話(huà),不會(huì)同時(shí)滾動(dòng)
4.加載plist數(shù)據(jù),分析數(shù)據(jù)結(jié)構(gòu)
plist是個(gè)數(shù)組:返回這一列有多少行國(guó)旗
數(shù)組里是一個(gè)字典:描述著國(guó)旗的屬性
5.字典轉(zhuǎn)模型
6.有了數(shù)據(jù)就需要把數(shù)據(jù)展示到界面,不能用返回每行標(biāo)題的方法
7.搞一個(gè)View,每行需要展示一個(gè)標(biāo)題和圖片
8.自定義view,系統(tǒng)自帶的UIView,不好使
9.用xib描述自定義view,里面控件是固定的
10.設(shè)置每行的高度為4411.返回每行cell樣子的代理方法,reusingView在ios7沒(méi)有效果,view永遠(yuǎn)都是
空,沒(méi)有做緩存总寻。
四 鍵盤(pán)處理
1.搭建界面
2.文本框不可以讓用戶(hù)編輯
? ?2.1不能設(shè)置enable= NO,鍵盤(pán)不能彈出來(lái)
? ?2.2通過(guò)代理,不允許用戶(hù)輸入,只有生日和城市不需要用戶(hù)輸入,添加一個(gè)判斷
3.自定義生日鍵盤(pán)
? ?3.1 UIDatePicker基本使用,模式,地區(qū)3.2監(jiān)聽(tīng)UIDatePicker的事件,繼承UIControl,直接addTarget
? ?3.3日期格式對(duì)象,把date轉(zhuǎn)換字符串,顯示到文本框
4.自定義城市鍵盤(pán)
? ?4.1 UIPickerView,展示數(shù)據(jù)需要設(shè)置數(shù)據(jù)源和代理
? ?4.2解析plist數(shù)據(jù),分析數(shù)據(jù)結(jié)構(gòu)plist是個(gè)數(shù)組,表示有多少個(gè)省份數(shù)組里是一個(gè)字典,里面包含省份的信 ? ? ? ? ? ?息,名稱(chēng)和城市列表
? ?4.3實(shí)現(xiàn)數(shù)據(jù)源和代理,把數(shù)據(jù)展示到視圖
? ?4.4和之前的點(diǎn)餐不一樣,之前直接能獲取到每一列有多少行,這里需要判斷當(dāng)前是哪一列,根據(jù)第0列獲取 ? ? ? ? ? 第1列的行數(shù),第0列是省,第1列是城市,城市由省決定
? ?4.5返回第component列多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0) { // 描述省會(huì)
return self.provinces.count;
}else{ // 描述選中的省會(huì)的城市
// 獲取省會(huì)
XMGProvince *p = self.provinces[_proIndex];
return p.cities.count;
}
}
? ? 4.6返回第component列第row行的標(biāo)題,這里的行號(hào)可能是第0列的和第1列的,需要做判斷。第0列的 ? ? ? ? ? ? ?row,表示是哪個(gè)省,第1列的row,表示是當(dāng)前第1列選中的省會(huì)的哪個(gè)城市梢为。
? ? ? ? ?第0列,省會(huì)的標(biāo)題,取決于省會(huì)數(shù)組行號(hào)
? ? ? ? ?第1列,城市的標(biāo)題,取決于當(dāng)前選中哪個(gè)省
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0) { // 描述省會(huì)
// 獲取省會(huì)
XMGProvince *p = self.provinces[row];
return p.name;
}else{ // 描述選中的省會(huì)的城市
// 獲取選中的省會(huì)的角標(biāo)
NSInteger index = [pickerView selectedRowInComponent:0];
// 獲取選中省會(huì)
XMGProvince *p = self.provinces[_proIndex];
// 當(dāng)前選中的內(nèi)蒙古省渐行,只有12個(gè)城市,角標(biāo)0~11铸董,但是右邊城市是北京祟印,北京的城市大于12個(gè)城市,所以滾動(dòng)的時(shí)候會(huì)出現(xiàn)越界粟害。
NSLog(@"province:%@, count:%ld row:%ld",p.name,p.cities.count,row);
#warning TODO:
return p.cities[row];
}
}
? ? ?4.7解決二級(jí)聯(lián)動(dòng)的問(wèn)題,兩列同時(shí)滾動(dòng),會(huì)報(bào)角標(biāo)越界錯(cuò)誤
? ? ? ? 原因:返回每一行的樣子的代理方法會(huì)經(jīng)常調(diào)用,只要有新的一行出現(xiàn)就會(huì)調(diào)用蕴忆。這里每次都會(huì)獲取最 ? ? ? ? ? 新選中的省,而第0列展示的是之前選中的省會(huì),如果最新選中的省會(huì)的城市總數(shù)小于之前選中的省會(huì)。
? ? ? ? 假設(shè):最新選中的城市只有有4個(gè),但是之前選中的省會(huì)城市有10行,當(dāng)?shù)?列滾到5就會(huì)報(bào)角標(biāo)越界錯(cuò) ? ? ? ? ? ? ?誤悲幅。
? ? ? ? ? 解決方式:這里不能獲取最新的選中省會(huì),需要記錄之前選中的,且只需要記錄一次,在選中一行的代理 ? ? ? ? ? 方法里記錄套鹅。
? ? ? ? ? ?注意:在刷新城市之前記住省會(huì)角標(biāo),應(yīng)該刷新的城市,是當(dāng)前選中的省會(huì)的城市。
? 4.8監(jiān)聽(tīng)城市選擇,選中新的省會(huì)汰具。
? ? ? ? 1>記錄選中的省會(huì)
? ? ? ? 2>刷新第1列
? ? ? ? 3>第一列默認(rèn)選中第一個(gè)城市
? ? ? ? ?4>把選中的省會(huì)和獲取選中的城市顯示到文本框
5.添加自定義鍵盤(pán)工具條
? ? ? ? 5.1封裝工具條:繼承UIView,原因:不讓外界知道里面是什么東西,就不能修改Toolbar里面的東西卓鹿。
? ? ? ? 5.2固定的,用xib述,并且 供類(lèi)方法快速創(chuàng)建對(duì)象
? ? ? ? 5.3整個(gè)文本框應(yīng)該擁有同一個(gè)鍵盤(pán)工具條,懶加載一個(gè)鍵盤(pán)工具條,然后遍歷所有的文本框,搞個(gè)可變 ? ? ? ? ? ? ? ?數(shù)組把所有文本框添加到數(shù)組
? ? ? ? 5.4監(jiān)聽(tīng)item點(diǎn)擊,通過(guò)代理通知控制器。
? ? ? ? 5.5當(dāng)點(diǎn)擊下一個(gè),應(yīng)該是后面的文本框有彈出鍵盤(pán),成為第一響應(yīng)者,怎么判斷下一個(gè)文本框是誰(shuí)?
? ? ? ? ? ? ? ○把所有文本框加入到數(shù)組中,記錄當(dāng)前彈出鍵盤(pán)的文本框所在的角標(biāo),++就是下一個(gè)文本框了留荔。
? ? ? ? ? ? ? ○在文本框開(kāi)始編輯的時(shí)候,記錄,編輯的文本框就是彈出鍵盤(pán)的文本框
? ? ? ? ?5.6解決角標(biāo)越界的問(wèn)題,當(dāng)當(dāng)前彈出鍵盤(pán)的文本框是第一個(gè)角標(biāo)的時(shí)候,上一個(gè)不允許點(diǎn)擊
五吟孙、項(xiàng)目中的常見(jiàn)文件
六、UIApplication
1.什么是UIApplication?
注意:UIApplication不能手動(dòng)創(chuàng)建,不能alloc init,一個(gè)應(yīng)用程序只允許
一個(gè)。
為什么要弄成單例,UIApplication對(duì)象是用來(lái)設(shè)置應(yīng)用全局信息的,一個(gè)
應(yīng)用程序如果有很多UIApplication對(duì)象,都不知道聽(tīng)誰(shuí)的杰妓。
驗(yàn)證:單例和不能alloc,init
2.UIApplication的作用:做應(yīng)用級(jí)別的操作
2.1>設(shè)置應(yīng)用圖標(biāo)右上角的數(shù)字,圖標(biāo)需要手動(dòng)清除,應(yīng)用程序關(guān)閉,不
會(huì)自動(dòng)清除.
applicationIconBadgeNumber
2.2>顯示聯(lián)網(wǎng)狀態(tài),告訴用戶(hù)此應(yīng)用正在聯(lián)網(wǎng)networkActivityIndicatorVisible
2.3>打開(kāi)一個(gè)資源3.URL:一個(gè)資源的唯一路徑
3.1>網(wǎng)絡(luò)資源URL的組成==協(xié)議頭://主機(jī)域名/路徑http://www.baidu.com/abc/1.png
3.2>本地資源URL的組成==協(xié)議頭:///路徑 本機(jī)域名可以不寫(xiě)file:///User/apple/Desktop/1.png
4.UIApplication打開(kāi)資源的好處:不用判斷用什么軟件打開(kāi),系統(tǒng)會(huì)自動(dòng)根據(jù)協(xié)議頭判斷藻治。
5.UIApplication管理狀態(tài)欄.PPT演示
5.1> ios7默認(rèn)交給控制器,需要配置下,不交給控制器管理,就會(huì)交個(gè)UIApplication管理。
5.2>動(dòng)畫(huà)隱藏狀態(tài)欄
5.3>動(dòng)畫(huà)設(shè)置狀態(tài)欄樣式
七稚失、UIApplication的Delegate
1.AppDelegate的作用:
?為什么要搞個(gè)AppDelegate,代理設(shè)計(jì)模式,有些事情自己不想處理,交
給別人處理
?怎么成為UIApplication的代理,遵守協(xié)議栋艳。
2.在哪設(shè)置UIApplication的代理,需要了解ios程序的啟動(dòng)過(guò)程.
2.1>創(chuàng)建application,創(chuàng)建并且設(shè)置application的代理
2.2>開(kāi)啟事件循環(huán),不斷監(jiān)聽(tīng)事件。如果產(chǎn)生系統(tǒng)事件,就會(huì)通知代
理,其他事件,會(huì)找到一個(gè)最合適的視圖處理事件句各。2.3>只有應(yīng)用程序關(guān)閉,才會(huì)結(jié)束程序
3.UIApplicationMain函數(shù):PPT演示
?注意UIApplicationMain函數(shù)會(huì)開(kāi)啟一個(gè)事件循環(huán),并不會(huì)馬上就執(zhí)行完
畢吸占。
?底層做的事情,創(chuàng)建UIApplication對(duì)象和UIApplicationDelegate對(duì)象,設(shè)置
UIApplication的代理,開(kāi)啟事件循環(huán),監(jiān)聽(tīng)系統(tǒng)事件。
3.1>delegateClassName不能傳nil,這里傳nil,意味著application沒(méi)有代理,就無(wú)法監(jiān)聽(tīng)系統(tǒng)的事件,系統(tǒng)的事件都沒(méi)法監(jiān)聽(tīng),窗口都不知道什么時(shí)候去加載,因?yàn)橐晥D都是懶加載的,因此就不會(huì)創(chuàng)建窗口,什么東西都沒(méi)有凿宾。
3.2>principalClassName傳nil,默認(rèn)是UIApplication,創(chuàng)建一個(gè)
UIApplication對(duì)象矾屯。
4.UIApplication代理的作用:處理系統(tǒng)事件,不是任何事件都交給他處理,按
鈕點(diǎn)擊,屏幕點(diǎn)擊都不是他處理,是由UIApplication處理。
2.1>加載完成,初始化的操作
2.2>進(jìn)入后臺(tái):一般在這里保存應(yīng)用的數(shù)據(jù)(游戲數(shù)據(jù),比如暫停游戲)
2.3>內(nèi)存警告:清空不必要的內(nèi)容