UIPickerView的使用

简述: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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值