使用场景
- 通常在注册模块,通过自定义inputView来自定义键盘加一个UIDatePicker来实现日期的选择
- 主要用来选择固定的内容,限制输入。
使用步骤
与uitableview有点相似,需要实现数据源方法和代理方法
-
数据源2个方法:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
- 这个方法返回有多少列在pickerView中,component是列的意思
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component- 这个方法返回在Compoent列中有多少行,需要明确告诉在第几列中有多少行,比如 if(component == 1) return 3 这样的句子,说明第2列中有3行.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
-
代理方法
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component- 这个方法是设置显示什么文字内容,在特定的第几行第几列显示返回的文字内容,会调用row*component次,每到一个坐标位置,就会调用,所以row相当于Y,component相当于X。
- (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component
reusingView:(UIView *)view- 这个方法设置返回一个uiview,可以结合xib和自定义控件来实现,返回一个自定义的View放在指定的component的row
- (void)pickerView:(UIPickerView *)pickerView
didSelectRow:(NSInteger)row
inComponent:(NSInteger)component- 这个方法是当UIPickerView被滚动选中某一列中的某一行时候调用,调用时候会传滚动后被选中的component和row过来,然后可以在这个函数里面进行操作,比如选中后就马上更新数据调用[pickerView reloadComponet:1];
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
二级联动bug解决
- 二级联动就是第一列选中某一行后,第二列现在指定的内容,比如选中省后展示那个省里面的城市,
- 主要特征就是plist文件中,存的是字典,字典中包含数组。就是一列显示字典的名字,一列显示字典里面数组的内容。
- 这个时候,如果两列同时滚动会出现bug,因为可能数组越界。
- 这时候需要一个属性来存当前选中的省,然后在返回数据的代理方法中,用这个index去获取指定位置的城市。
- reloadcomponent 会重新调用数据源的代理方法