iOS开发实战:从零基础到App Store上架
上QQ阅读APP看书,第一时间看更新

2.13 选择器控件——UIPickerView

UIPickerView 是一个简易的列表控件,用于提供给用户有限个数的选项供用户选择,UIPickerView的UI设计十分漂亮,是iOS系统特有的UI模式。在实际应用中,UIPickerView的应用也十分广泛,例如省市县选择列表、时间选择、日期选择等都可以通过UIPickerView来设计。

2.13.1 创建一个UIPickerView控件

UIPickerView与之前章节中的UI控件有着很大不同,UIPickerView更加复杂一些,它是通过代理和数据源的方法来对其进行设置和数据源的填充,这种控件的设计模式也是代理模式的应用之一。使用Xcode创建一个名为UIPickerViewTest的工程,在ViewController.m文件的声明部分添加对相应协议的遵守,这里需要遵守两个协议,分别是UIPickerViewDelegate 和UIPickerViewDataSource。

        @interface ViewController ()<UIPickerViewDataSource, UIPickerViewDelegate>
        @end

在viewDidLoad方法中添加如下代码。

        - (void)viewDidLoad {
            [super viewDidLoad];
            UIPickerView * picker = [[UIPickerView alloc]initWithFrame:CGRectMake
    (20, 100, 280, 150)];
            picker.delegate=self;
            picker.dataSource=self;
            [self.view addSubview:picker];
        }

上面的代码中除了对UIPickerView 进行创建和初始化工作外,设置了当前类对象为它的数据源和代理。在ViewController.m文件中实现如下代理方法:

        -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
            return 2;
        }
        -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:
    (NSInteger)component{
            return 10;
        }
        -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)
    row forComponent:(NSInteger)component{
            return [NSString stringWithFormat:@"%lu分区%lu数据", component, row];
        }
        -(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NS
    Integer)component{
            return 44;
        }
        -(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInte
    ger)component{
            return 140;
        }

numberOfComponentsInPickerView:方法返回一个NSInterger 类型的整数,用于设置UIPickerView视图的分区数,也可以理解为选择列表的列数。

pickerView:numberOfRowsInComponent:方法的返回值设置UIPickerView 每个分区的行数,参数component用于判断具体的分区。

pickerView:titleForRow:forComponent:方法的返回值设置列表中每一行的数据,这个方法中的两个参数row和component分别用于区分行与列。

pickerView:rowHeightForComponent:方法的返回值设置具体行的行高。

pickerView:widthForComponent:方法的返回值设置分区的宽度,即列的宽度。

运行工程,效果如图2-39所示。

图2-39 UIPickerView控件

2.13.2 UIPickerView选中数据时的回调代理

UIPickerView 总是会展现几列数据,帮助用户进行快速选择,当用户上下滑动UIPickerView 列表时,列表中的数据会进行上下滑动移动,当移动动作停止时,这时悬停在UIPickerView 列表中间的数据即为用户选中的数据,并且此时,系统也会调用UIPickerView的如下代理方法来通知开发者用户的选择。

        -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
    inComponent:(NSInteger)component{
            NSLog(@"%lu, %lu", row, component);
        }

pickerView:didSelectRow:inComponent:方法在调用时,row参数和component参数会将用户选择的行和分区的信息传递给开发者。