文章目录
- UIPickerViewDataSource数据源协议
- UIPickerViewDelegate代理协议
- 属性方法
- 使用
- 日期和其他选择器
-
- #import
UIPickerViewDataSource数据源协议
UIPickerView中展示的数据项都是通过其数据源对象来实现的,UIPickerView的数据源对象需要遵守UIPickerViewDataSource数据源协议。在UIPickerViewDataSource数据源协议中定义了如下两个方法,这两个方法都是强制必须要实现的。
设置UIPickerView中所包含的列数,在UIPickerView中列被称为Component
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
设置UIPickerView中每个列Component所包含的行数,该方法中的参数component可以获取当前设置的列序号
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
UIPickerViewDelegate代理协议
在UIPickerViewDataSource数据源协议中,仅仅提供了UIPickerView包含了几列以及每一列的行数,而每一行展示的选项是通过UIPickerViewDelegate代理协议中的方法进行设置的。
-(nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
为了获取用户当前选中的选项,在UIPickerViewDelegate中也提供了对应的方法,可以使我们获取到当前的选中项,以便做进一步的处理。
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
除此之外,UIPickerViewDelegate中还提供了一些用于定制UIPickerView选项外观的方法,例如,我们可以设置列宽、行宽等操作。
设置列宽
-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
设置行宽
-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
为指定行设置定制外观
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view;
属性方法
由于UIPickerView继承自UIView,因此UIPickerView的外观属性的定制可以使用UIView中的一些属性或方法。另外,在UIPickerView类中,还提供了一些特殊的属性以及方法,需要重点关注。
设置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;
使用
//
// ViewController.m
// UIPickerView_base
//
// Created by on 2019/7/16.
// Copyright © 2019 Shae. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>
@property (nonatomic,strong)UIPickerView *pickerView;
@property (nonatomic,strong)NSArray *dataArray;
@property (nonatomic,strong)UILabel *label;
@end
@implementation ViewController
- (NSArray *)dataArray{
if (_dataArray==nil) {
[email protected][@"北京",@"天津",@"南京",@"上海",@"唐山",@"重庆"];
}
return _dataArray;
}
- (UIPickerView *)pickerView{
if (_pickerView==nil) {
_pickerView=[[UIPickerView alloc]initWithFrame:CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, 400)];
_pickerView.layer.masksToBounds=YES;
_pickerView.layer.borderWidth=1;
_pickerView.dataSource=self;
_pickerView.delegate=self;
}
return _pickerView;
}
- (UILabel *)label{
if (_label==nil) {
_label=[[UILabel alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(self.pickerView.bounds)+100, [UIScreen mainScreen].bounds.size.width, 30)];
_label.backgroundColor=[UIColor yellowColor];
_label.textAlignment=NSTextAlignmentCenter;
_label.text=self.dataArray[0];
}
return _label;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.pickerView];
[self.view addSubview:self.label];
}
#pragma -mark data Data Source -
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return self.dataArray.count;
}
#pragma -mark delegate -
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
return self.dataArray[row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
self.label.text=self.dataArray[row];
}
@end
代码:https://github.com/ShaeZhuJiu/UIPickerView_base.git
日期和其他选择器
第三方库以giihub最新为准
#import <PGDatePickManager.h>
# import <BRPickerView.h>
//选择用户类型
-(void)selectUserType{
static NSString *resultStr;
// 性别
BRStringPickerView *stringPickerView = [[BRStringPickerView alloc]init];
stringPickerView.pickerMode = BRStringPickerComponentSingle;
stringPickerView.title = @"请选择用户类型";
stringPickerView.dataSourceArr =[self.addUserMode.userTypeArray copy];
stringPickerView.selectIndex = 0 ;
stringPickerView.resultModelBlock = ^(BRResultModel *resultModel) {
NSLog(@"%s,%ld,%@",__func__,(long)resultModel.index,resultModel.value);//resultModel.index有bug不准确
resultStr=resultModel.value;
self.addUserMode.userType=resultStr;//数据在这里获取
[self.addUserTableView reloadData];
};
[stringPickerView show];
}