UIPickerView基本使用
控件PickerView,拖線
-
設(shè)置數(shù)據(jù)源,設(shè)置代理
- self.pickView.dataSource = self
- self.pickView.delegate = self
-
遵守協(xié)議
- UIPickerViewDataSource
- UIPickerViewDelegate
-
實現(xiàn)數(shù)據(jù)源方法
- 共有多少列:numberOfComponentsInPickerView:
- 每一列有多少行:numberOfRowsInComponents:
-
實現(xiàn)代理方法
- widthForComponents:每一列的寬度
- rowHeightForComponents:每一行的行高
- titleForRow:forComponent:每一列的每一行展示什么標(biāo)題
- pickerView:attributeedTitleForRow:forComponent:每一列的每一行展示帶有屬性的標(biāo)題(屬性:文字的大小顏色)
- pickerView:viewForRow:forComponent:reusingView:每一列的每一行展示視圖
- pickerView:didSelectedRow:inComponent:當(dāng)選中某一列的某一行的時候會自動調(diào)用
-
展示數(shù)據(jù)
- 定義數(shù)據(jù)的數(shù)組屬性蒜鸡,懶加載
- 獲取plist路徑
- 從路徑當(dāng)中加載數(shù)組
-
Label展示選中的數(shù)據(jù)
- didSelectedRow:InComponent:
- 設(shè)置默認(rèn)
自定義鍵盤
搭建界面
-
textField,只能選擇蜓洪,不能輸入(攔截用戶輸入)
- 攔截文本框纤勒,設(shè)置textField代理
- 設(shè)置代理,self.countryTextF.delegate = self
- 遵守協(xié)議<UITextFieldDelegate>
- 實現(xiàn)代理方法
- textFieldShouldBeginEditing:是否允許開始編輯 YES
- textFieldDidBeginEditing:開始編輯的時候調(diào)用隆檀,成為第一響應(yīng)者彈出鍵盤
- textFieldShouldEndEditing:是否允許結(jié)束編輯摇天,如果設(shè)置為NO,就出不來了,所以要設(shè)置為YES
- textFieldDidEndEditing:當(dāng)結(jié)束編輯的時候調(diào)用
-
textField:shouldChangeCharactersInRange:replacementString:
是否允許改變字符,NO
-
點擊textField彈出自定義的鍵盤
- show in finder -> 新建文件夾 -> 把文件夾拖到工程里面 ->創(chuàng)建自定義類
- 從storyboard或者xib綁定類的刚操,加載完畢后闸翅,都會調(diào)用awakeFromNib方法
- 修改鍵盤類型self.inputView輸入的視圖,默認(rèn)是系統(tǒng)的鍵盤
- 創(chuàng)建pickerView:alloc/init
- 設(shè)置pickView的數(shù)據(jù)源和代理菊霜,遵守協(xié)議
- 實現(xiàn)pickerView代理方法
- self.inputView = pickerView
-
通過代碼,彈出pickerView济赎,封裝的思想
- 重寫initWithFrame:方法
- 設(shè)置pickView的數(shù)據(jù)源和代理鉴逞,遵守協(xié)議
- 實現(xiàn)pickerView代理方法
- self.inputView = pickerView
注意
:在同一個類中,把相同的代碼司训,寫到同一個方法當(dāng)中构捡,減少代碼量,高內(nèi)聚-
pickerView內(nèi)部展示國旗數(shù)據(jù)
- 創(chuàng)建模型壳猜,加載plist文件勾徽,字典轉(zhuǎn)模型
- 驗證數(shù)據(jù)是否加載成功
- 列數(shù):1
- 行數(shù):self.flagArray.count;
- 每一行展示的UIView:pickerView:viewForRow:forComponent:reusingView:
- xib描述view
- 綁定view的類
- 創(chuàng)建flagView
- loadNibName:owner:options:
- [0]
- xib描述view
- 取出數(shù)據(jù),把數(shù)據(jù)給view,讓view展示數(shù)據(jù)
- 取出模型
- flagV中提供一個模型
- return flagView;
-
設(shè)置行高
- pickerView:rowHeightForComponent:
-
KVC的底層實現(xiàn)
- 拿字符串與當(dāng)前類的屬性進(jìn)行匹配统扳,如果匹配到喘帚,就給該屬性賦值。
- setValuesForKeyWithDictionary:
- 遍歷字典[dict enumerateKeysAndObjectsUsingBlock:^(){
內(nèi)部調(diào)用setValue:obj ForKeyPath:key
1.去找有沒有跟key值相同名稱的set方法咒钟,就會調(diào)用set方法吹由,把obj傳入
2.如果沒有set方法,那么它會去找有沒有相同名稱并且?guī)в邢聞澗€的成員屬性朱嘴,如果有就會給該屬性賦值
3.如果也沒有帶有下劃線的成員屬性倾鲫,有沒有跟它相同名稱的成員屬性
4.如果還沒有跟它相同名稱的成員屬性粗合,就會調(diào)用setValueForUndefinedKey:
5.如果沒有實現(xiàn)setValueForUndefinedKey:就直接報錯
}]
-
KVO的底層實現(xiàn)
- 耗性能,少用KVO
- 原理:監(jiān)聽某個屬性值的改變
- 在運(yùn)行的過程中派生一個類乌昔,在這個類中隙疚,有一個屬性,就是你要監(jiān)聽的屬性磕道,會在屬性里重寫set方法供屉,在set方法內(nèi)部,調(diào)用obsever的方法
-
代碼優(yōu)化
- 不要在view里面進(jìn)行邏輯運(yùn)算捅厂,把運(yùn)算寫到模型里面贯卦,賦值的時候,直接賦值焙贷,比如icon賦值
- 重寫icon的set方法
- (void)setIcon:(UIImage *)icon{
if ([icon isKindOfClass:[NSSting class]]){
UIImage *image = [UIImage imageNamed:(NSString*)icon];
_icon = image;
}else{
_icon = icon;
}
}
- 滾動過程中撵割,把國家顯示到文本框中
- 代理didSelectRow:
- 取出當(dāng)前模型
- self.text = item.name;
UIDatePicker
- 生日鍵盤
- 自定義鍵盤
- awakeFromNib
- ininWithFrame:
- 修改鍵盤類型
- UIDatePicker
- 修改日期模式
- .datePickerMode = ModeDate
- 修改地區(qū)
- .locale = [NSLocale localeWithLocalIdentifier:@"zh"]
- iso編碼
- 滾動過程當(dāng)中,把日期顯示到文本框中去
- UIDatePicker沒有代理
- target:繼承UIControl
- pickView addTarget:action:forControlEvent:
- 事件類型:可以通過拖線的方式辙芍,看event有哪些
- 獲取當(dāng)前datepick的日期
- NSDate * currentDate = datepick.date
- 把日期轉(zhuǎn)成字符串
- NSDateFormatter alloc/init
- .dateFormat= @"yyyy-MM-dd"
- stringFromDate:
- 給當(dāng)前文本框賦值
- self.text = dateString
城市鍵盤
- 自定義textField
- awakeFromNib
- initWithFrame:
- 設(shè)置代理
- 遵守協(xié)議
- 實現(xiàn)代理方法
- 展示數(shù)據(jù)
- 創(chuàng)建模型
- 懶加載
- 字典轉(zhuǎn)模型
- 數(shù)據(jù)源代理方法
兩列
-
第0列有多少行
- self.proviceArray.count
-
第1列有多少行
- 定義一個屬性啡彬,記錄當(dāng)前選中的是哪個省份
- 取出模型self.proviceArray[self.provinceIndex]
- 當(dāng)前選中省份下,城市的個數(shù)
- provinceItem.cities.count;
-
每一列每一行展示什么內(nèi)容
- 第0列:返回省份的名稱
- 省模型:self.provinceArray[row]
- return item.name
- 第1列:選中省份下城市的名稱
- self.provinceArray[self.provinceIndex]
- return provinceItem.cities[row];
- 滾動省份故硅,變化城市名稱
- didSelectRow:
- 滾動第0列開始做處理
- 更新index
- self.provinceIndex = row
- 變數(shù)據(jù),刷新列表(重新調(diào)用數(shù)據(jù)源代理方法)
- reloadAllComponents
- 當(dāng)滾動完畢之后庶灿,讓第一列選中第0行
- selectRow:inComponent:animated:
- 省份的名稱和城市的名稱顯示到textF中
- 省份的模型self.provinceArray[self.provinceIndex]
- provinceItem.name;
- 獲取當(dāng)前選中省份下,當(dāng)前選中的城市
- 獲取當(dāng)前第一列選中的是哪一行
- 獲取第一列行號
- rowIndex = selectedRowInComponent:1
- provinceItem.cities[rowIndex]
- 拼接
- stingWithFormat:%@-%@