免费开源的iOS开发学习平台

UIPickerView详解:1-UIPickerView简介

UIPickerView是一个选择器控件,它可以生成单列选择器,也可以生成多列选择器,而且开发者完全可以自定义可选项的外观,用法非常灵活。比如:淘宝中的地址选择器就是如此。UIPikerView继承自UIView,因此,它的事件处理可以由其代理完成。

UIPickerViewDataSource数据源协议

UIPickerView中展示的数据项都是通过其数据源对象来实现的,UIPickerView的数据源对象需要遵守UIPickerViewDataSource数据源协议。在UIPickerViewDataSource数据源协议中定义了如下两个方法,这两个方法都是强制必须要实现的。

  • 设置UIPickerView中所包含的列数,在UIPickerView中列被称为Component
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
  • 设置UIPickerView中每个列Component所包含的行数,该方法中的参数component可以获取当前设置的列序号
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;

UIPickerViewDelegate代理协议

在UIPickerViewDataSource数据源协议中,仅仅提供了UIPickerView包含了几列以及每一列的行数,而每一行展示的选项是通过UIPickerViewDelegate代理协议中的方法进行设置的。

- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;

为了获取用户当前选中的选项,在UIPickerViewDelegate中也提供了对应的方法,可以使我们获取到当前的选中项,以便做进一步的处理。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;

除此之外,UIPickerViewDelegate中还提供了一些用于定制UIPickerView选项外观的方法,例如,我们可以设置列宽、行宽等操作。

  • 设置列宽
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
  • 设置行宽
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
  • 为指定行设置定制外观
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view;

基本属性和方法介绍

由于UIPickerView继承自UIView,因此UIPickerView的外观属性的定制可以使用UIView中的一些属性或方法。另外,在UIPickerView类中,还提供了一些特殊的属性以及方法,需要重点关注。

  • 设置UIPickerView对象的数据源对象以及代理对象
@property(nullable,nonatomic,weak) id<UIPickerViewDataSource> dataSource; 
@property(nullable,nonatomic,weak) id<UIPickerViewDelegate>   delegate;  
  • 重新加载列
- (void)reloadAllComponents;
- (void)reloadComponent:(NSInteger)component;
  • 获取当前选中的选项序号
- (NSInteger)selectedRowInComponent:(NSInteger)component;