iOS学习之路-UIPickerView初认识与使用

来源:互联网 发布:混沌与秩序2随从数据库 编辑:程序博客网 时间:2024/05/01 22:33

一、简单的介绍

UIPickerView,即取值控件。而取值控件就行iOS的下拉菜单,虽然在界面呈现方面它和所谓的下拉菜单并不同,不过对于使用的目的和场景确实相同的。UIPickerView直接继承自UIView,没有继承UIControl,因此,它并不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其代理对象来完成。UIPickView和UITableView的使用过程较相似,都需要一个数据源对象和一个代理对象。

二、UIPickView控件常用的方法和属性:

(1) - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView; 返回PickerView的列数

(2) - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;返回PickView的component列对应的行数

(3) - (nullableNSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; 返回每一列每一行的内容

(4) - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component; 用户选中PickView的某一列和某一行时会调用该方法

(5) - (nullableNSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component修改PickView中component列row行的文本的样式

(6) - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view 该方法返回的UIView的控件将直接作为UIPickView对应的component 列row行的列表项

(7) - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component 设置component列对应的行高

(8) - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component该方法设置component列对应的宽度

(9) - (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated该方法设置选中的UIPickView 第component列row行项,最后一个参数animated代表是否要用到动画

(10) @property(nonatomic,readonly)NSInteger numberOfComponents;获取UIPickerView指定列中包含的列表项的数量,该属性是只读的。

三、使用——省份城市的选择

(1)程序运行结果

2)程序说明

当滚动第一列,即省份的列时,第二列即省份对应的城市的列也会跟着改变,当滚动停止时,下方的两个label会显示当前UIPickView选中的列和对应行的内容。

(3)部分源代码

#pragma mark - 代理方法/** *  返回一共有多少列 */- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{    return 2;}/** *  返回第component列的行数 */- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{    if (component == 0) {        // 直接返回第0列的行数        return self.provinces.count;    }else{        // 获取当前选中了哪一个省份        long Index = [self.pickerView selectedRowInComponent:0];        // 取得该省份的模型        KIMProvince *province = self.provinces[Index];        // 返回省份模型的cities数组的个数作为第二列的行数        return province.cities.count;    }}/** *  返回每一列每一行的内容 */- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{    if (component == 0) {        // 取得第0列第row行的省份模型        KIMProvince *province = self.provinces[row];        // 返回省份模型的名称属性        return province.name;    }else{        // 定义Index 记录当前选中了第0列的行数        long Index = [self.pickerView selectedRowInComponent:0];        // 取得该行的省份模型        KIMProvince *province = self.provinces[Index];        // 返回省份模型的cities数组的下标为row的名称        return province.cities[row];    }}/** *  将当前选中的列和行的内容显示到label */- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{    if (component == 0) {        // 若当前选中的是第0列,则刷新第1列的数据        [pickerView reloadComponent:1];        // 使cityLabel显示为第1列第0行的城市名称        [pickerView selectRow:0 inComponent:1 animated:YES];    }    // 定义PIndex 记录当前选中了第0列的行数    long PIndex = [self.pickerView selectedRowInComponent:0];    // 取得该行的省份模型    KIMProvince *province = self.provinces[PIndex];    // 取得该省份模型的省份名称,并显示在provinceLabel    self.provinceLabel.text = province.name;    // 取得选中第1列的行数    long CIndex = [self.pickerView selectedRowInComponent:1];    // 取得省份模型的cities数组下标对应的城市名称,并显示在cityLabel    self.cityLabel.text = province.cities[CIndex];}
(4)注意事项及其问题

在storyboard拖出一个UIPickView时,要主要设置UIPickView的代理对象和数据源,这里我们都将代理对象和数据源都设置为控制器即ViewController。

程序中有一个bug。当同时滚动两列的时候,程序会崩溃。报错*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (6) beyond bounds (1)'   这是因为,当同时滚动两列时,第一列的省份对应着不同的城市,即第一列决定第二列的行数,当两列一起滚动时,就会发生数组越界的错误。

四、总结

UIPickView学习起来还是挺简单的,没有难的地方。在平时的项目中基本很少用这个,所以UIPickView一般都是用到的时候,在去查找资料的。实际开发的项目中的应用的话,一般有性别的选中,出生日期,所在的省份城市等等。


——爱分享,一起学,共成长。

0 0