UIPickerView与UIDatePicker这两个控件之间有着非常相似的地方,只不过显示的内容有所不同,相对于其他的控件其实他们显得有些鸡肋,因为使用的地方并不是很多,大多数时候是被我们忽略的控件。
就拿UIPicker来说,它比较常使用的地方一般是在选择城市,点餐系统等地方的时候会相应的进行一些使用,不过它的使用非常简单,当然这么说是因为能看到这篇文章的你一定对整个iOS开发有一定的熟悉程度了,那么你一定非常熟悉UITableView的使用了。没错,想要使用UIPickerView你必须设置它的代理属性(delegate)和数据源(dataSource),自然的我们的控制器必须要遵循它的两个协议。
#import "ViewController.h"
@interface ViewController ()<UIPickerViewDataSource, UIPickerViewDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
}
@end
当这些准备工作做好之后我们就可以开始正式使用UIPickerView这个控件了,当然这还仅仅只是个开始,我们还有必须要实现的方法来支撑它的显示,首先我们必须要实现它的两个数据源方法。
#pragma mark ---- 数据源方法 ----
//一共有多少列
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
//返回一共有多少列
}
//第component列显示多少行
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
//返回每一列有多少行
}
这两个数据源方法是系统要求我们必须实现的,但是这也仅仅只是告诉我们我们的UIPickerView有多少列,每一列有多少行,它的上面还是一片空白,并没有显示任何数据,那么接下来我们就必须去实现它的代理方法去显示每一列的每一行具体显示什么数据。
我们都能够熟练的使用UITableView,那么两者对比我们能发现在使用上,两者有些许不同, 首先UITableView的数据源方法有三个要求我们必须实现,而UIPickerView只有两个(显示数据的方法属于代理方法)。其次UITableView的自定义Cell和使用系统默认Cell是在Cell的显示方法中去实现的,而UIPickerView的系统默认和自定义是分属于不同的代理方法。
// 第component列的第row行显示什么文字
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
//返回的是每一行显示的内容(此代理方法仅仅只能显示字符串,不能自定义)
}
// 第component列第row行显示怎样的view(内容)
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
//返回可以是自定义的UIView对象,但是需要考虑性能的问题
}
这些是一个UIPickerView要显示到屏幕上来必不可少得方法,当然我们一般使用并不是仅仅如此,我们还会有进一步的操作,这个时候它的一些常用的代理方法就十分重要的,例如UITableView中Cell被点击时候的代理方法,当然UIPickerView也有选中时候的代理方法:
// 选中了pickerView的第component列第row行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//选中时候的一些业务逻辑在此处进行处理
}
还有类似UITableView设置行高和列宽的方法:
// 第component列的宽度是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
//直接返回宽度数值
}
// 第component列的行高是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
//直接返回行高的数值
}
除了以上的数据源方法和代理方法用来显示UIPickerView之外,还有一些其他的方法在我们使用或者设置的时候可能会用的上,在这里我都一一列举出来。
UIPickerView的常见方法
// 重新刷新所有列
- (void)reloadAllComponents;
// 重新刷新第component列
- (void)reloadComponent:(NSInteger)component;
// 主动选中第component列的第row行
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
// 获得第component列的当前选中的行号
- (NSInteger)selectedRowInComponent:(NSInteger)component;
然后让我们来看看UIDataPicker控件,这个控件使用的也不是很多,一般都是选择日期的时候会用到,必须生日或者选择日期等操作,它的使用相对来说就更加简单了,因为一般来说它主要是作为UITextField的输出源,用来替代默认的键盘,它的创建比较简单,不需要实现数据源和代理方法,只要直接实例化就可以了,具体的使用,我用下面的实例来说明。
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputField;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//自定义文本框键盘
UIDatePicker *picker = [[UIDatePicker alloc] init];
//显示格式
picker.datePickerMode = UIDatePickerModeDate;
//设置区域(以中文的形式显示)
picker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
self.inputField.inputView = picker;
//自定义文本框键盘上面显示的工具控件
UIToolbar *tool = [[UIToolbar alloc] init];
tool.frame = CGRectMake(0, 0, 320, 44);
//工具条颜色
tool.barTintColor = [UIColor grayColor];
UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"上一个" style:UIBarButtonItemStylePlain target:self action:@selector(previousClick)];
//不可以点击选项
// item1.enabled = NO;
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"下一个" style:UIBarButtonItemStylePlain target:self action:@selector(nextClick)];
UIBarButtonItem *item3 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *item4 = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(doneClick)];
tool.items = @[item1, item2, item3, item4];
self.inputField.inputAccessoryView = tool;
}
- (void) previousClick
{
NSLog(@"上一个...");
}
- (void) nextClick
{
NSLog(@"下一个...");
}
- (void) doneClick
{
NSLog(@"完成...");
//退出键盘
[self.view endEditing:YES];
}
@end
需要注意的是UIDatePicker上可以添加UIToolBar控件,但是在它的上面只能添加UIBarButtonItem的控件来监听事件的点击等等。