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