简述: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];
}