UIPickerView的使用
2016-10-14 10:54
351 查看
UIPickerView功能与UIDatePicker类似
初始化实例时,通常只需要设置原点坐标,不需要设置宽高(默认宽高为:frame = (0 0; 320 216))
区别在于:
1、UIPickerView需要自定义实现数据类型(包括:数据源,列数等)
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
@interface ViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
@property (nonatomic, strong) NSDictionary *sourceDict;
@property (nonatomic, strong) NSString *rowTitleFirst;
@property (nonatomic, strong) NSString *rowTitleSecond;
@property (nonatomic, strong) NSString *rowTitleThird;
@property (nonatomic, strong) UITextField *textfield;
@end
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
UIPickerView *pickerView = [[UIPickerView alloc] init];
// [self.view addSubview:pickerView];
pickerView.backgroundColor = [UIColor orangeColor];
NSLog(@"pickerView %@", pickerView);
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
/*
设置代理
1 包括代理对象,及数据源代理对象
2 实现代理方法的对象
3 添加协议
4 实现代理方法
注意事项
1、两种代理必须同时实现
2、标题显示设置三选一,只设置其中一个方法即可
2-1、- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
2-2、- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
2-3、- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
*/
pickerView.delegate = self;
pickerView.dataSource = self;
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// 设置数据源
NSArray *meizhouArray = @[@"梅县", @"五华县", @"丰顺县", @"大埔县", @"蕉岭县", @"兴宁市", @"梅江区"];
NSArray *guangzhouArray = @[@"天河区", @"白云区", @"荔湾区", @"番禺区", @"海珠区", @"花都区", @"从化区", @"增城区"];
NSArray *shenzhenArray = @[@"龙华新区", @"大鹏新区", @"福田区", @"罗湖区", @"宝安区", @"龙岗区", @"南山区"];
NSDictionary *guangdongCityDict = [NSDictionary dictionaryWithObjectsAndKeys:shenzhenArray, @"深圳市", guangzhouArray, @"广州市", meizhouArray, @"梅州市", nil nil];
NSDictionary *guangxiCityDict = [NSDictionary dictionaryWithObjectsAndKeys:@[], @"柳州市", @[], @"桂林市", nil nil];
self.sourceDict = [NSDictionary dictionaryWithObjectsAndKeys:guangdongCityDict, @"广东省", guangxiCityDict, @"广西省", nil nil];
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// 设置默认值
self.rowTitleFirst = @"广东省";
self.rowTitleSecond = @"深圳市";
[pickerView selectRow:0 inComponent:0 animated:NO];
[pickerView selectRow:0 inComponent:1 animated:NO];
[pickerView selectRow:3 inComponent:2 animated:NO];
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// 刷新数据
[pickerView reloadAllComponents];
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// 通过textfield来使用
self.textfield = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 50.0, (CGRectGetWidth(self.view.bounds) - 10.0 * 2), 40.0)];
[self.view addSubview:self.textfield];
self.textfield.backgroundColor = [UIColor yellowColor];
self.textfield.textColor = [UIColor redColor];
self.textfield.placeholder = @"请选择地址(省市区)";
// 添加键盘上方的子视图
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, CGRectGetWidth(self.view.bounds), 40.0);
button.backgroundColor = [UIColor greenColor];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button setTitle:@"隐藏键盘" forState:UIControlStateNormal];
[button addTarget:self action:@selector(hiddenKeyboard:) forControlEvents:UIControlEventTouchUpInside];
self.textfield.inputAccessoryView = button;
//输入源改成地址选择视图
self.textfield.inputView = pickerView;
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// UIPickerViewDelegate
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
// 设置列的宽度
return 100.0;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
// 设置列中的每行的高度
return 40.0;
}
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// 设置列中的每行的显示标题NSString
// 设置每列每行的标题
NSArray *keyArray = self.sourceDict.allKeys;
if (0 == component)
{
NSString *title = keyArray[row];
return title;
}
else if (1 ==component)
{
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
NSString *title = cityArray[row];
return title;
}
else if (2 == component)
{
NSDictionary *areaDict = self.sourceDict[self.rowTitleFirst];
NSArray *areaArray = areaDict[self.rowTitleSecond];
NSString *title = areaArray[row];
return title;
}
return nil;
}
//- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
//{
// // 设置列中的每行的显示标题NSAttributedString
// return nil;
//}
//- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
//{
// // 设置列中的每行的自定义视图
// return nil;
//}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
// 获取列中选中的某一行
NSLog(@"component = %ld, row = %ld", component, row);
NSArray *keyArray = self.sourceDict.allKeys;
if (0 == component)
{
NSString *keyFirst = keyArray[row];
// 设置第一列的值,即key1
self.rowTitleFirst = keyFirst;
// 当第一列改变时,第二列的值应该跟着改变,即key2,设置为默认第二列的第一个值
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
if (cityArray && 0 < cityArray.count)
{
NSString *keySecond = cityArray[0];
self.rowTitleSecond = keySecond;
}
// 设置第三个标题,当第二列改变时,第三wfhr值路着改变
NSArray *areaArray = cityDict[self.rowTitleSecond];
if (areaArray && 0 < areaArray.count)
{
NSString *keyThird = areaArray[0];
self.rowTitleThird = keyThird;
}
else
{
// 没有第三列时,将第三列的默认标题设置为空
self.rowTitleThird = nil;
}
// 重新刷新第2列的数据,且设置显示为第一行
[pickerView reloadComponent:1];
[pickerView selectRow:0 inComponent:1 animated:YES];
// 重新刷新第3列的数据,且设置显示为第一行
[pickerView reloadComponent:2];
[pickerView selectRow:0 inComponent:2 animated:YES];
}
else if (1 ==component)
{
// 设置第二个标题
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
NSString *keySecond = cityArray[row];
self.rowTitleSecond = keySecond;
// 设置第三个标题,默认第一行
NSArray *areaArray = cityDict[self.rowTitleSecond];
if (areaArray && 0 < areaArray.count)
{
NSString *keyThird = areaArray[0];
self.rowTitleThird = keyThird;
}
// 重新刷新第3列的数据,且设置显示为第一行
[pickerView reloadComponent:2];
[pickerView selectRow:0 inComponent:2 animated:YES];
}
else if (2 == component)
{
// 设置第三个标题
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *areaArray = cityDict[self.rowTitleSecond];
if (areaArray && 0 < areaArray.count)
{
NSString *keyThird = areaArray[row];
self.rowTitleThird = keyThird;
}
}
NSString *text = [NSString stringWithFormat:@"%@%@%@", self.rowTitleFirst, self.rowTitleSecond, self.rowTitleThird];
NSLog(@"选择结果:%@", text);
self.textfield.text = text;
}
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// UIPickerViewDataSource
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
// 设置列数
// 设置三列:省、市、区
return 3;
}
// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
// 设置每列的行数
// 设置每列的实际行数
NSArray *keyArray = self.sourceDict.allKeys;
if (0 == component)
{
return keyArray.count;
}
else if (1 ==component)
{
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
return cityArray.count;
}
else if (2 == component)
{
NSDictionary *areaDict = self.sourceDict[self.rowTitleFirst];
NSArray *areaArray = areaDict[self.rowTitleSecond];
return areaArray.count;
}
return 0;
}
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// 隐藏键盘
- (void)hiddenKeyboard:(UIButton *)button
{
[self.view endEditing:YES];
}
![](https://img-blog.csdn.net/20160605133136058?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
初始化实例时,通常只需要设置原点坐标,不需要设置宽高(默认宽高为:frame = (0 0; 320 216))
区别在于:
1、UIPickerView需要自定义实现数据类型(包括:数据源,列数等)
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
@interface ViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
@property (nonatomic, strong) NSDictionary *sourceDict;
@property (nonatomic, strong) NSString *rowTitleFirst;
@property (nonatomic, strong) NSString *rowTitleSecond;
@property (nonatomic, strong) NSString *rowTitleThird;
@property (nonatomic, strong) UITextField *textfield;
@end
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
UIPickerView *pickerView = [[UIPickerView alloc] init];
// [self.view addSubview:pickerView];
pickerView.backgroundColor = [UIColor orangeColor];
NSLog(@"pickerView %@", pickerView);
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
/*
设置代理
1 包括代理对象,及数据源代理对象
2 实现代理方法的对象
3 添加协议
4 实现代理方法
注意事项
1、两种代理必须同时实现
2、标题显示设置三选一,只设置其中一个方法即可
2-1、- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
2-2、- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
2-3、- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
*/
pickerView.delegate = self;
pickerView.dataSource = self;
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// 设置数据源
NSArray *meizhouArray = @[@"梅县", @"五华县", @"丰顺县", @"大埔县", @"蕉岭县", @"兴宁市", @"梅江区"];
NSArray *guangzhouArray = @[@"天河区", @"白云区", @"荔湾区", @"番禺区", @"海珠区", @"花都区", @"从化区", @"增城区"];
NSArray *shenzhenArray = @[@"龙华新区", @"大鹏新区", @"福田区", @"罗湖区", @"宝安区", @"龙岗区", @"南山区"];
NSDictionary *guangdongCityDict = [NSDictionary dictionaryWithObjectsAndKeys:shenzhenArray, @"深圳市", guangzhouArray, @"广州市", meizhouArray, @"梅州市", nil nil];
NSDictionary *guangxiCityDict = [NSDictionary dictionaryWithObjectsAndKeys:@[], @"柳州市", @[], @"桂林市", nil nil];
self.sourceDict = [NSDictionary dictionaryWithObjectsAndKeys:guangdongCityDict, @"广东省", guangxiCityDict, @"广西省", nil nil];
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// 设置默认值
self.rowTitleFirst = @"广东省";
self.rowTitleSecond = @"深圳市";
[pickerView selectRow:0 inComponent:0 animated:NO];
[pickerView selectRow:0 inComponent:1 animated:NO];
[pickerView selectRow:3 inComponent:2 animated:NO];
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// 刷新数据
[pickerView reloadAllComponents];
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// 通过textfield来使用
self.textfield = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 50.0, (CGRectGetWidth(self.view.bounds) - 10.0 * 2), 40.0)];
[self.view addSubview:self.textfield];
self.textfield.backgroundColor = [UIColor yellowColor];
self.textfield.textColor = [UIColor redColor];
self.textfield.placeholder = @"请选择地址(省市区)";
// 添加键盘上方的子视图
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, CGRectGetWidth(self.view.bounds), 40.0);
button.backgroundColor = [UIColor greenColor];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button setTitle:@"隐藏键盘" forState:UIControlStateNormal];
[button addTarget:self action:@selector(hiddenKeyboard:) forControlEvents:UIControlEventTouchUpInside];
self.textfield.inputAccessoryView = button;
//输入源改成地址选择视图
self.textfield.inputView = pickerView;
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// UIPickerViewDelegate
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
// 设置列的宽度
return 100.0;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
// 设置列中的每行的高度
return 40.0;
}
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// 设置列中的每行的显示标题NSString
// 设置每列每行的标题
NSArray *keyArray = self.sourceDict.allKeys;
if (0 == component)
{
NSString *title = keyArray[row];
return title;
}
else if (1 ==component)
{
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
NSString *title = cityArray[row];
return title;
}
else if (2 == component)
{
NSDictionary *areaDict = self.sourceDict[self.rowTitleFirst];
NSArray *areaArray = areaDict[self.rowTitleSecond];
NSString *title = areaArray[row];
return title;
}
return nil;
}
//- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
//{
// // 设置列中的每行的显示标题NSAttributedString
// return nil;
//}
//- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
//{
// // 设置列中的每行的自定义视图
// return nil;
//}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
// 获取列中选中的某一行
NSLog(@"component = %ld, row = %ld", component, row);
NSArray *keyArray = self.sourceDict.allKeys;
if (0 == component)
{
NSString *keyFirst = keyArray[row];
// 设置第一列的值,即key1
self.rowTitleFirst = keyFirst;
// 当第一列改变时,第二列的值应该跟着改变,即key2,设置为默认第二列的第一个值
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
if (cityArray && 0 < cityArray.count)
{
NSString *keySecond = cityArray[0];
self.rowTitleSecond = keySecond;
}
// 设置第三个标题,当第二列改变时,第三wfhr值路着改变
NSArray *areaArray = cityDict[self.rowTitleSecond];
if (areaArray && 0 < areaArray.count)
{
NSString *keyThird = areaArray[0];
self.rowTitleThird = keyThird;
}
else
{
// 没有第三列时,将第三列的默认标题设置为空
self.rowTitleThird = nil;
}
// 重新刷新第2列的数据,且设置显示为第一行
[pickerView reloadComponent:1];
[pickerView selectRow:0 inComponent:1 animated:YES];
// 重新刷新第3列的数据,且设置显示为第一行
[pickerView reloadComponent:2];
[pickerView selectRow:0 inComponent:2 animated:YES];
}
else if (1 ==component)
{
// 设置第二个标题
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
NSString *keySecond = cityArray[row];
self.rowTitleSecond = keySecond;
// 设置第三个标题,默认第一行
NSArray *areaArray = cityDict[self.rowTitleSecond];
if (areaArray && 0 < areaArray.count)
{
NSString *keyThird = areaArray[0];
self.rowTitleThird = keyThird;
}
// 重新刷新第3列的数据,且设置显示为第一行
[pickerView reloadComponent:2];
[pickerView selectRow:0 inComponent:2 animated:YES];
}
else if (2 == component)
{
// 设置第三个标题
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *areaArray = cityDict[self.rowTitleSecond];
if (areaArray && 0 < areaArray.count)
{
NSString *keyThird = areaArray[row];
self.rowTitleThird = keyThird;
}
}
NSString *text = [NSString stringWithFormat:@"%@%@%@", self.rowTitleFirst, self.rowTitleSecond, self.rowTitleThird];
NSLog(@"选择结果:%@", text);
self.textfield.text = text;
}
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// UIPickerViewDataSource
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
// 设置列数
// 设置三列:省、市、区
return 3;
}
// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
// 设置每列的行数
// 设置每列的实际行数
NSArray *keyArray = self.sourceDict.allKeys;
if (0 == component)
{
return keyArray.count;
}
else if (1 ==component)
{
NSDictionary *cityDict = self.sourceDict[self.rowTitleFirst];
NSArray *cityArray = cityDict.allKeys;
return cityArray.count;
}
else if (2 == component)
{
NSDictionary *areaDict = self.sourceDict[self.rowTitleFirst];
NSArray *areaArray = areaDict[self.rowTitleSecond];
return areaArray.count;
}
return 0;
}
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
// 隐藏键盘
- (void)hiddenKeyboard:(UIButton *)button
{
[self.view endEditing:YES];
}
相关文章推荐
- IOS学习之UIPickerView控件的简单使用
- iOS学习之UIPickerView控件的简单使用
- iOS学习之UIPickerView控件的简单使用
- ios-UIPickerView基本使用
- UIPickerView控件简单使用
- iOS学习之UIPickerView控件的简单使用
- iOS学习之UIPickerView控件的简单使用
- iOS学习之UIPickerView控件的简单使用
- iOS学习之UIPickerView控件的简单使用
- UIPickerView使用
- UIPickerView入门使用
- iOS学习之UIPickerView控件的简单使用
- 代码使用UIPickerView
- iOS开发 点菜系统 使用UIPickerView
- 在cocos2d库能使用UIPickerView
- UIPickerView 的使用
- iOS学习之UIPickerView控件的简单使用
- UIPickerView 和 UITextField 键盘的混搭使用
- iOS学习笔记—— UIPickerView 控件的简单使用
- iOS学习之UIPickerView控件的简单使用