UIPickView和UIDatePicker

一、介紹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>內存警告:清空不必要的內容

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容