UIPickerView基本使用
程序员文章站
2022-05-27 14:15:24
UIPickerView是很常用的一个UI控件,在各种购物平台选择地址时候都是必备的,下面我们来说一下具体的使用 首先UIPickerView的创建,与多数控件一样,分配内存并设置位置尺寸。 重要的的是代理与数据源,设置代理和数据源后服从代理和数据源协议 其中数据源里面有两个必须实现的方法 UIPi ......
uipickerview是很常用的一个ui控件,在各种购物平台选择地址时候都是必备的,下面我们来说一下具体的使用
首先uipickerview的创建,与多数控件一样,分配内存并设置位置尺寸。
重要的的是代理与数据源,设置代理和数据源后服从代理和数据源协议
<uipickerviewdelegate,uipickerviewdatasource>
其中数据源里面有两个必须实现的方法
//设置列数 - (nsinteger)numberofcomponentsinpickerview:(uipickerview *)pickerview{ return count; } //设置指定列包含的项数 - (nsinteger)pickerview:(uipickerview *)pickerview numberofrowsincomponent:(nsinteger)component{
}
uipickerview是可以只设置单列的,列被称为component,此时返回的列数为1即可,单更多时候需要的是多列情况,此时设置返回值为自己所需要的列数即可。
在uipickerviewdatasource数据源协议中,仅仅提供了uipickerview包含几列以及每一列的项数,而每一行展示的选项是通过uipickerviewdelegate协议中的方法来设置的。
//设置每个选项显示的内容 - (nsstring *)pickerview:(uipickerview *)pickerview titleforrow:(nsinteger)row forcomponent:(nsinteger)component{ } //获取用户当前选中的选项 - (void)pickerview:(uipickerview *)pickerview didselectrow:(nsinteger)row incomponent:(nsinteger)component{ }
uipickerview基本属性和方法:
设置数据源对象以及代理对象
@property(nullable,nonatomic,weak) id<uipickerviewdatasource> datasource; @property(nullable,nonatomic,weak) id<uipickerviewdelegate> delegate;
重新加载列:
- (void)reloadallcomponents; - (void)reloadcomponent:(nsinteger)component;
获取当前选中的选项序号:
- (nsinteger)selectedrowincomponent:(nsinteger)component;
指定选中的项显示在中间位置,一般设置第一项放在中间:
- (void)selectrow:(nsinteger)row incomponent:(nsinteger)component animated:(bool)animated;
下面是一个简单的完整示例:
#import "viewcontroller.h" @interface viewcontroller ()<uipickerviewdelegate,uipickerviewdatasource> @property(nonatomic,strong)uipickerview *pickerview; @property(nonatomic,strong)nsdictionary *dictionary; @property(nonatomic,strong)nsarray *provincearray; @property(nonatomic,copy)nsstring *selectedprovince; @end @implementation viewcontroller - (void)viewdidload { [super viewdidload]; self.dictionary = @{@"江苏":@[@"南京",@"徐州",@"镇江",@"无锡",@"常州"],@"河北":@[@"石家庄",@"保定",@"承德",@"沧州",@"秦皇岛"]}; //获取字典中所有的省份并排序保存 self.provincearray = [[self.dictionary allkeys] sortedarrayusingselector:@selector(compare:)]; self.selectedprovince = self.provincearray[0]; [self.view addsubview:self.pickerview]; } //懒加载 - (uipickerview *)pickerview{ if (_pickerview == nil) { self.pickerview = [[uipickerview alloc]initwithframe:cgrectmake(0, 44, self.view.frame.size.width, 400)]; _pickerview.layer.maskstobounds = yes; _pickerview.layer.borderwidth = 1; _pickerview.delegate = self; _pickerview.datasource = self; } return _pickerview; } #pragma mark ------- datesource&&delegate -------- //设置列数 - (nsinteger)numberofcomponentsinpickerview:(uipickerview *)pickerview{ return 2; } //设置指定列包含的项数 - (nsinteger)pickerview:(uipickerview *)pickerview numberofrowsincomponent:(nsinteger)component{ if (component == 0) { return self.provincearray.count; } return [self.dictionary[self.selectedprovince] count]; } //设置每个选项显示的内容 - (nsstring *)pickerview:(uipickerview *)pickerview titleforrow:(nsinteger)row forcomponent:(nsinteger)component{ if (component == 0) { return self.provincearray[row]; } return [self.dictionary[self.selectedprovince] objectatindex:row]; } //用户进行选择 - (void)pickerview:(uipickerview *)pickerview didselectrow:(nsinteger)row incomponent:(nsinteger)component{ if (component == 0) { self.selectedprovince = self.provincearray[row]; [self.pickerview reloadcomponent:1]; //设置第二列首选的始终是第一个 [self.pickerview selectrow:0 incomponent:1 animated:yes]; } } @end
上一篇: Nuxt.js 数据双向绑定的实现