UIPickerView的使用

来源:互联网 发布:线切割hl绘图编程软件 编辑:程序博客网 时间:2024/04/28 05:00

简述:UIPickerView是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活。UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成。使用UIPickerView的对象应该遵守UIPickerViewDataSource,UIPickerViewDelegate。

一、UIPickerView控件常用的属性和方法如下:
《1》 numberOfComponents:获取UIPickerView指定列中包含的列表项的数量。该属性是一个只读属性。

《2》 showsSelectionIndicator:该属性控制是否显示UIPickerView中的选中标记(以高亮背景作为选中标记)。

《3》 - numberOfRowsInComponent::获取UIPickerView包含的列数量。

《4》 - rowSizeForComponent::获取UIPickerView包含的指定列中列表项的大小。该方法返回一个CGSize对象。

《5》 - selectRow:inComponent:animated::该方法设置选中该UIPickerView中指定列的特定列表项。最后一个参数控制是否使用动画。

《6》 - selectedRowInComponent::该方法返回该UIPickerView指定列中被选中的列表项。

《7》 - viewForRow:forComponent::该方法返回该UIPickerView指定列的列表项所使用的UIView控件。

UIDatePicker控件只是负责该控件的通用行为,而该控件包含多少列,各列包含多少个列表项则由UIPickerViewDataSource对象负责。开发者必须为UIPickerView设置
UIPickerViewDataSource对象,并实现如下两个方法。

《8》 - numberOfComponentsInPickerView::该UIPickerView将通过该方法来判断应该包含多少列。

《9》 - pickerView:numberOfRowsInComponent::该UIPickerView将通过该方法判断指定列应该包含多少个列表项。

《10》 - pickerView:rowHeightForComponent::该方法返回的CGFloat值将作为该UIPickerView控件中指定列中列表项的高度。

《11》 - pickerView:widthForComponent::该方法返回的CGFloat值将作为该UIPickerView控件中指定列的宽度。

《12》 - pickerView:titleForRow:forComponent::该方法返回的NSString值将作为该UIPickerView控件中指定列的列表项的文本标题。

《13》 - pickerView:viewForRow:forComponent:reusingView::该方法返回的UIView控件将直接作为该UIPickerView控件中指定列的指定列表项。

《14》- pickerView:didSelectRow:inComponent::当用户单击选中该UIPickerView控件的指定列的指定列表项时将会激发该方法。

二、UIPickerView的使用方法:
1、遵守协议

@interface PickerViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>

2、创建pickerView

//创建pickerView- (UIPickerView *)pickerView{    //初始化一个PickerView    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(50, 300, 300, 200)];    pickerView.tag = 1000;    //指定Picker的代理    pickerView.dataSource = self;    pickerView.delegate = self;    //是否要显示选中的指示器(默认值是NO)    pickerView.showsSelectionIndicator = NO;    return pickerView;}

3、创建数据源

//创建数据源- (void)createDataSource{    //举例1    self.nameArray = @[@"周润发",@"刘德华",@"赵传",@"那英",@"汪峰",@"周杰伦"];    self.iconArray = @[@"哈哈",@"姐姐",@"刷刷刷",@"呵呵呵",@"��",@"��",@"��"];    //举例2    //得到数据源的路径    //NSString *path = [[NSBundle mainBundle] pathForResource:@"Address" ofType:@"plist"];    //根据路径得到国家所有的信息    //self.countriesDict = [[NSDictionary alloc] initWithContentsOfFile:path];    //得到所有的省份名(key值)    //self.provinceArray = [self.countriesDict allKeys];    //得到省份下对应的所有的城市(value值)    //self.selectedArray = [self.countriesDict objectForKey:[[self.countriesDict allKeys] objectAtIndex:0]];    //判断城市是否为空    //if (self.selectedArray.count > 0) {        //得到所有的城市名(key值)        //self.cityArray = [[self.selectedArray objectAtIndex:0] allKeys];        //NSLog(@"%@",self.cityArray);    //}    //判断城市名数组是否为空    //if (self.cityArray.count > 0) {        //得到对应城市下得所有县区(value值)        //self.countyArray = [[self.selectedArray objectAtIndex:0] objectForKey:[self.cityArray objectAtIndex:0]];    //}//}}

4、实现代理方法(以下代理方法内部的数据为举例,并不是一个完整地项目)

#pragma mark --- 与DataSource有关的代理方法//返回列数(必须实现)- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{    return 2;}//返回每列里边的行数(必须实现)- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{    //如果是第一列    if (component == 0) {        //返回姓名数组的个数        return self.nameArray.count;    }    else    {        //返回表情数组的个数        return self.iconArray.count;    }}#pragma mark --- 与处理有关的代理方法//设置组件的宽度- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{    if (component == 0) {        return 100;    }    else    {        return 80;    }}//设置组件中每行的高度- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{    if (component == 0) {        return 60;    }    else    {        return 60;    }}//设置组件中每行的标题row:行- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{    if (component == 0) {        return self.nameArray[row];    }    else    {        return self.iconArray[row];    }}//- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {}//- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{}//选中行的事件处理- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{   //选择第一列执行的方法    if (component == 0) {        //根据被选中的行得到省中所有的城市(value值)        self.selectedArray = [self.countriesDict objectForKey:[self.provinceArray objectAtIndex:row]];        if (self.selectedArray.count > 0) {//判断得到的数组是否为空            //不为空,获得到所有的城市名(key值)            self.cityArray = [[self.selectedArray objectAtIndex:0] allKeys];        }        else {            //为空,则城市为nil            self.cityArray = nil;        }        //判断获得的城市名数组是否为空        if (self.cityArray.count > 0) {            //不为空,取到所有的县区名(value值)            self.countyArray = [[self.selectedArray objectAtIndex:0] objectForKey:[self.cityArray objectAtIndex:0]];        } else {            //为空则,县区为nil            self.countyArray = nil;        }        //刷新第一列的信息        [pickerView reloadComponent:1];    }    //选择第二列执行的方法    if (component == 1) {        //判断城市数组和城市名数组是否为空        if (self.selectedArray.count > 0 && self.cityArray.count > 0) {            //得到所有的县区(value值)            self.countyArray = [[self.selectedArray objectAtIndex:0] objectForKey:[self.cityArray objectAtIndex:row]];        } else {            self.countyArray = nil;        }        [pickerView selectRow:1 inComponent:2 animated:YES];    }    //刷新第二列的信息    [pickerView reloadComponent:2];}//btn的回调方法- (void)btnAction: (UIButton *)sender{    //获取pickerView    UIPickerView *pickerView = [self.view viewWithTag:1000];    //选中的行    NSInteger result = [pickerView selectedRowInComponent:0];    //赋值    self.nameLabel.text = self.nameArray[result];    NSInteger result1 = [pickerView selectedRowInComponent:1];    self.iconLabel.text = self.iconArray[result1];}
1 0