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

UIPickerView详解:2-UIPickerView的基本使用

本节我们通过UIPickerView实现一个最简单的单列选择器,通过该案例来了解一下UIPickerView的代理协议、数据源协议以及属性的使用方法。在该案例中,通过UIPickerView展示几大城市名称,被选中的内容会在下方的label上展示出来。

准备工作

  • 在控制器类中,添加需要使用的属性,并设置控制器类遵守UIPickerViewDataSource以及UIPickerViewDelegate协议
@interface ViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
@property(nonatomic,strong)UIPickerView *pickerView;
@property(nonatomic,strong)NSArray *dataArray;
@property(nonatomic,strong)UILabel *label;
@end
  • 初始化dataArray属性,在其中添加若干个在UIPickerView中展示的选项
- (NSArray *)dataArray {
    if (_dataArray == nil) {
        _dataArray  = @[@"北京",@"天津",@"南京",@"上海",@"唐山",@"重庆"];
    }
    return _dataArray;
}
  • 初始化UIPickerView对象,对其外观属性进行简单定制,并设置其数据源对象以及代理对象为本控制器
- (UIPickerView *)pickerView {
    if (_pickerView == nil) {
        _pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, 400)];
        _pickerView.layer.masksToBounds = YES;
        _pickerView.layer.borderWidth = 1;
        _pickerView.dataSource = self;
        _pickerView.delegate = self;
    }
    return _pickerView;
}
  • 初始化用于展示被选中内容的UILabel控件
- (UILabel *)label {
    if (_label == nil) {
        _label = [[UILabel alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(self.pickerView.bounds)+100, [UIScreen mainScreen].bounds.size.width, 30)];
        _label.backgroundColor = [UIColor yellowColor];
        _label.textAlignment = NSTextAlignmentCenter;
        _label.text = self.dataArray[0];
    }
    return _label;
}
  • 添加子控件到控制器view上
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.pickerView];
    [self.view addSubview:self.label];
}

实现UIPickerViewDataSource中的方法

UIPickerViewDataSource中定义的两个方法用于设置UIPickerView的列数以及每列的选项数,要求必须实现。

  • 设置列数,简单期间我们只显示一列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}
  • 设置指定列中包含的选项数,此时我们根据dataArray数组中的元素个数设置
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return self.dataArray.count;
}

实现UIPickerViewDelegate中的方法

UIPickerViewDelegate代理协议中的方法,为每个选项提供数据,并且可以监听用户的交互行为。

  • 设置每个选项的显示内容
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return self.dataArray[row];
}
  • 获取用户的选择,并更新到自定义UILabel中
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    self.label.text = self.dataArray[row];
}

运行效果:

示例代码

https://github.com/99ios/10.4.2