iOS系统UIPickerView的简单使用和方法属性介绍

 本文是通过自己查看阅读资料,对UIPickerView做了一个较为全面的解释,在本文中也有一些引用了其他作者对于属性和方法的描述,最后会有我自己写的代码,多余话不说了,直奔主题,


UIPickerView与UITableView有些类似 都有俩个协议方法 DataSource

UIPickerView也是一个选择器控件,可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活。

  UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成。

 

  UIPickerView控件常用的属性和方法如下。

属性:

   numberOfComponents:获取UIPickerView指定列中包含的列表项的数量。该属性是一个只读属性。

  

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

  

 方法:

 - (NSInteger)numberOfRowsInComponent:(NSInteger)component;   获取UIPickerView包含的列数量。

 - (CGSize)rowSizeForComponent:(NSInteger)component;   获取UIPickerView包含的指定列中列表项的大小。该方法返回一个CGSize对象。

 

 - (void)selectRow:(NSInteger)row inComponent:(NSInteger)componentanimated:(BOOL)animated;该方法设置选中该UIPickerView中指定列的特定列表项。最后一个参数控制是否使用动画。

 - (NSInteger)selectedRowInComponent:(NSInteger)component;该方法返回该UIPickerView指定列中被选中的列表项。

  

 - (UIView *)viewForRow:(NSInteger)rowforComponent:(NSInteger)component; 该方法返回该UIPickerView指定列的列表项所使用的UIView控件。

 - (void)reloadAllComponents;刷新所有列的数据

 - (void)reloadComponent:(NSInteger)component;刷新某一列的数据

 

UIPickerViewDataSource

 

UIPickerView控件包含多少列,各列包含多少个列表项则由UIPickerViewDataSource对象负责。开发者必须为UIPickerView设置

UIPickerViewDataSource对象,并实现如下两个方法。

    

  -  (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView;  UIPickerView将通过该方法来判断应该包含多少列

 

  - (NSInteger)pickerView:(UIPickerView *)pickerViewnumberOfRowsInComponent:(NSInteger)component;    

UIPickerView将通过该方法判断指定列应该包含多少个列表项。

 

  UIPickerViewDelegate

      如果程序需要控制UIPickerView中各列的宽度,以及各列中列表项的大小和外观,或程序需要为UIPickerView的选中事件提供响应,都需要为UIPickerView设置UIPickerViewDelegate委托对象,并根据需要实现该委托对象中的如下方法。

 

  - (CGFloat)pickerView:(UIPickerView *)pickerViewwidthForComponent:(NSInteger)component;

该方法返回的CGFloat值将作为该UIPickerView控件中指定列中列表项的高度。

  

  - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;该方法返回的CGFloat值将作为该UIPickerView控件中指定列的宽度。


  - (NSString *)pickerView:(UIPickerView *)pickerViewtitleForRow:(NSInteger)row forComponent:(NSInteger)component;该方法返回的NSString值将作为该UIPickerView控件中指定列的列表项的文本标题。

  

 - (NSAttributedString *)pickerView:(UIPickerView *)pickerViewattributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component ;

NS_AVAILABLE_IOS(6_0) 该方法返回的UIView控件将直接作为该UIPickerView控件中指定列的指定列表项。

 

  - (UIView *)pickerView:(UIPickerView *)pickerViewviewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView*)view;   当用户单击选中该UIPickerView控件的指定列的指定列表项时将会激发该方法。

  - (void)pickerView:(UIPickerView*)pickerViewdidSelectRow:(NSInteger)rowinComponent:(NSInteger)component;当用户单击选中该UIPickerView控件的指定列的指定列表项时将会激发该方法。


下面是我的代码实现,下文中获得plist文件是我从网上找的城市的plist文件,从plist文件中获取省名,城市名

 首先创建工程 然后设置根视图控制器,在根视图控制器的 .m 文件里面写如下代码:


#import "MainViewController.h"

@interface MainViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>

@property(nonatomic,strong)UIPickerView *pickerView;

@property(nonatomic,strong)NSMutableArray *content;

@property(nonatomic,assign)NSInteger row;

@end


@implementation MainViewController


#pragma mark 懒加载

- (NSMutableArray *)content{

    if (!_content) {

        self.content = [NSMutableArray array];

    }

    return _content;

}

- (UIPickerView *)pickerView{

    if (!_pickerView) {

        self.pickerView = [[UIPickerView alloc] init];

    }

    return _pickerView;

}


- (void)viewDidLoad {

    [super viewDidLoad];

    //设置选择器的frame

    self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(30, 100, 300, 500)];

    //获取plist文件

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"plist"];

    self.content = [NSMutableArray arrayWithContentsOfFile:plistPath];

    self.pickerView.showsSelectionIndicator =YES//这个方法在iOS7之后好像没什么用

    self.pickerView.delegate = self;

    self.pickerView.dataSource = self;

   //打印获取的每列的size;

    NSLog(@"%@", NSStringFromCGSize( [self.pickerView rowSizeForComponent:0]));

    

    //设置选中的第几列第几行 ,程序一开始运行时就选中该列该行

    [self.pickerView selectRow:2 inComponent:0 animated:YES];

    //获取组键数(列数)

    NSInteger row1 = self.pickerView.numberOfComponents;

    

//获取对象下标组键(列数)的行数

    NSInteger row2 = [self.pickerView numberOfRowsInComponent:1];

    NSLog(@"%ld--%ld",row1,row2);

    

     self.pickerView.showsSelectionIndicator =YES;

    //添加显示

    [self.view addSubview:self.pickerView];

}


#pragma mark UIPickerViewDataSource

//返回显示的列数

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

    return 2;

}

//显示每组键(列数)的行数

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

    if (component == 0) {

        return self.content.count;

    }else {

        

        self.row =  [self.pickerView selectedRowInComponent:0];//获取被选中的第一列的行数(这里是为了在给第二列赋值时用的,因此在此之前要理清代理方法的执行顺序,以免造成不必要的bug)

        NSArray *citys = [self.content[self.row]objectForKey:@"Cities"];

        

        return citys.count;

    }

}

#pragma mark UIPickerViewDelegate

//设置列高

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{

    if (component ==0) {

        return 100;//第一组键()的高度

   }else{

        return 100;//第二组键()的高度

    }

}

//返回每列的宽度

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{

    if (component ==0) {

        return 100;//第一组键()的宽度

    }else{

    return 100;//第二组键()的宽度

    }

}

//被选中的第几列 第几行

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

    if(component ==0){

        //刷新对应列

        [self.pickerView reloadComponent:1];

        //当选择第一列时 第二列切到第一行

        [self.pickerView selectRow:0 inComponent:component+1 animated:YES];

    }

}


//给行赋值

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{

    if (component ==0) {

        return [self.content[row] objectForKey:@"State"];//返回省的名称

    }else{

        //下面俩行代码是获得plist文件中城市的名称

        NSArray *cities = [self.content[self.row] objectForKey:@"Cities"];

        NSString *city =[cities[row] objectForKey:@"city"];

       return city;

    }

}

//可以用UILabel 来设置字体大小 和背景颜色 是一个可以自定义设置的方法

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{

    UILabel *label;//声明一个UILabel

    if (component == 0) {//当是第一行

        //设置frame

       label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];

       //将省名赋给label.text

       label.text = [self.content[row] objectForKey:@"State"];

       //改变字体的颜色

        label.textColor = [UIColor yellowColor];

        //设置字体大小

        label.font = [UIFont systemFontOfSize:20]; //label来设置字体大小

        //改变背景的颜色

        label.backgroundColor = [UIColor redColor];

    }else if (component == 1){//当是第二行时

       

        label  = [[UILabel alloc] initWithFrame:CGRectMake(100, 0, 100, 50)];

        

        NSArray *cities = [self.content[self.row] objectForKey:@"Cities"];

        NSString *city =[cities[row] objectForKey:@"city"];

        

        label.text = city ;//将城市名称赋给label.text

        label.textColor = [UIColor purpleColor];

        label.font = [UIFont systemFontOfSize:20];

        

        label.backgroundColor = [UIColor redColor];

    }

    return label;

    

}

 下图为我最后执行程序的效果图;




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值