1.搭建界面
1> 注意點(diǎn):UIPickerView的高度不能改,默認(rèn)162,PickerView里面每行的高度可以改,不要弄混淆了。
2.UIPickerView
1> 如何使用UIPickerView展示數(shù)據(jù)?
進(jìn)入U(xiǎn)IPickerView頭文件,有數(shù)據(jù)源和代理,聯(lián)想到UITableView,模仿UITableView的用法缘揪。
2> 讓控制器作為PickerView的數(shù)據(jù)源,控制器遵守PickerView的數(shù)據(jù)源方法
3> PickerView的數(shù)據(jù)源方法
1> numberOfComponentsInPickerView: 返回多少列
2> pickerView:numberOfRowsInComponent: 返回第component列有多少行
3> 和UITableView的區(qū)別,每一行長什么樣,是由PickerView的代理決定的密浑。
4> PickerView的代理方法
(1) 返回第component列第row行長什么樣迷郑。
第component列第row行的展示標(biāo)題
- (NSString *)pickerView:(UIPickerView *)pickerViewtitleForRow:(NSInteger)row forComponent:(NSInteger)component
第component列第row行帶屬性的標(biāo)題
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
第component列第row行展示的視圖
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)components usingView:(UIView *)view;
(2) 返回第component列每一行的高度和寬度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
(3) 選中第component列第row行調(diào)用
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
5>記錄當(dāng)前選中的行號
_proIndex = [pickerView selectedRowInComponent:0];
3.UIPickerView的應(yīng)用
1汗捡、單個(gè)PickerView的使用
//PickerView是用來展示數(shù)據(jù)的組件
#import "ViewController.h"
@interface ViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
//遵循協(xié)議
@property (nonatomic,strong)UIPickerView * pickerView;//自定義pickerview
@property (nonatomic,strong)NSArray * letter;//保存要展示的字母
@property (nonatomic,strong)NSArray * number;//保存要展示的數(shù)字
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//獲取需要展示的數(shù)據(jù)
[self loadData];
// 初始化pickerView
self.pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, 200)];
[self.view addSubview:self.pickerView];
//指定數(shù)據(jù)源和委托
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
}
#pragma mark 加載數(shù)據(jù)
-(void)loadData
{
//需要展示的數(shù)據(jù)以數(shù)組的形式保存
self.letter = @[@"aaa",@"bbb",@"ccc",@"ddd"];
self.number = @[@"111",@"222",@"333",@"444"];
}
#pragma mark UIPickerView DataSource Method 數(shù)據(jù)源方法
//指定pickerview有幾個(gè)表盤
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;//第一個(gè)展示字母、第二個(gè)展示數(shù)字
}
//指定每個(gè)表盤上有幾行數(shù)據(jù)
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
NSInteger result = 0;
switch (component) {
case 0:
result = self.letter.count;//根據(jù)數(shù)組的元素個(gè)數(shù)返回幾行數(shù)據(jù)
break;
case 1:
result = self.number.count;
break;
default:
break;
}
return result;
}
#pragma mark UIPickerView Delegate Method 代理方法
//指定每行如何展示數(shù)據(jù)(此處和tableview類似)
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSString * title = nil;
switch (component) {
case 0:
title = self.letter[row];
break;
case 1:
title = self.number[row];
break;
default:
break;
}
return title;
}
2.兩個(gè)PickerView聯(lián)動(dòng)
coding地址:https://coding.net/u/Panzz/p/UIPickerViewDemo/git
#import "T2ViewController.h"
@interface T2ViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
@property (strong, nonatomic) IBOutlet UIPickerView *pickerView;
@property (nonatomic,strong)NSArray * provinces;//展示省份
@property (nonatomic,strong)NSArray * cities;//展示城市
@property (nonatomic,strong)UILabel * label;
@end
@implementation T2ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self loadData];
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
}
-(void)loadData{
NSString * path = [[NSBundle mainBundle]pathForResource:@"area" ofType:@"plist"];
self.provinces = [NSArray arrayWithContentsOfFile:path];
self.cities = [NSArray arrayWithArray:self.provinces[0][@"Cities"]];
self.label = [[UILabel alloc]initWithFrame:CGRectZero];
self.label.translatesAutoresizingMaskIntoConstraints = NO;
self.label.backgroundColor = [UIColor groupTableViewBackgroundColor];
self.label.textColor = [UIColor greenColor];
self.label.font = [UIFont systemFontOfSize:30];
[self.label setTextAlignment:NSTextAlignmentCenter];
[self.view addSubview:self.label];
NSArray * labelTop = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[_pickerView]-30-[_label(50)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_pickerView,_label)];
NSArray * labelH = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[_label]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_label)];
[self.view addConstraints:labelTop];
[self.view addConstraints:labelH];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 2;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
NSInteger rows = 0;
switch (component) {
case 0:
rows = self.provinces.count;
break;
case 1:
rows = self.cities.count;
break;
default:
break;
}
return rows;
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
NSString * title = nil;
switch (component) {
case 0:
title = self.provinces[row][@"State"];
break;
case 1:
title = self.cities[row][@"city"];
break;
default:
break;
}
return title;
}
//選中時(shí)回調(diào)的委托方法,在此方法中實(shí)現(xiàn)省份和城市間的聯(lián)動(dòng)
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
switch (component) {
case 0://選中省份表盤時(shí)蒙兰,根據(jù)row的值改變城市數(shù)組,刷新城市數(shù)組
self.cities = self.provinces[row][@"Cities"];
[self.pickerView reloadComponent:1];
break;
case 1:
// NSLog(@"當(dāng)前選擇目的地為:%@%@",self.provinces[[self.pickerView selectedRowInComponent:0]][@"State"],self.cities[[self.pickerView selectedRowInComponent:1]][@"city"]);
self.label.text = [NSString stringWithFormat:@"%@%@",self.provinces[[self.pickerView selectedRowInComponent:0]][@"State"],self.cities[[self.pickerView selectedRowInComponent:1]][@"city"]];
break;
default:
break;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
3.自定義pickerview展示數(shù)據(jù)的方式label
#pragma mark pickerView Method
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;//表盤數(shù)量
}
//判斷是哪個(gè)pickerview,返回相應(yīng)的rows
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
NSInteger rows = 0;
if (pickerView == self.pickerView)
{
rows = self.pickerViewArr.count;
}
else
{
rows = self.pickerViewArr2.count;
}
return rows;
}
//判斷是哪個(gè)pickerview搜变,返回相應(yīng)的title
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSString *str = nil;
if (pickerView == self.pickerView)
{
str = self.pickerViewArr[row];
}
else
{
str = self.pickerViewArr2[row];
}
return str;
}
#pragma mark 給pickerview設(shè)置字體大小和顏色等
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
//可以通過自定義label達(dá)到自定義pickerview展示數(shù)據(jù)的方式
UILabel* pickerLabel = (UILabel*)view;
if (!pickerLabel)
{
pickerLabel = [[UILabel alloc] init];
pickerLabel.adjustsFontSizeToFitWidth = YES;
pickerLabel.textAlignment = NSTextAlignmentCenter;
[pickerLabel setBackgroundColor:[UIColor lightGrayColor]];
[pickerLabel setFont:[UIFont boldSystemFontOfSize:15]];
}
pickerLabel.text=[self pickerView:pickerView titleForRow:row forComponent:component];//調(diào)用上一個(gè)委托方法采缚,獲得要展示的title
return pickerLabel;
}
//選中某行后回調(diào)的方法,獲得選中結(jié)果
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (pickerView == self.pickerView)
{
self.pickerViewSelect = self.pickerViewArr[row];
NSLog(@"selected == %@",self.pickerViewSelect);
}
else
{
self.pickerViewSelect2 = self.pickerViewArr2[row];
}
}
代碼地址