IOS笔记045-UIDatePicker和UIPickerView

这是两种可以上下滚动的控件。
这是UIDatePicker,可以显示日期和时间。
IOS笔记045-UIDatePicker和UIPickerView
文章图片

这个是UIPickerView,显示类似几个选择项的界面。
注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。
IOS笔记045-UIDatePicker和UIPickerView
文章图片


做一个简单界面进行练习。单击生日输入框弹出自定义UIDatePicker,单击城市弹出自定义UIPickerView选择城市。
IOS笔记045-UIDatePicker和UIPickerView
文章图片

1、UIDatePicker使用 在点击过文本输入框后弹出日期选中键盘。需要给UITextField控件的inutView属性指定需要显示的界面。
这里显示的代码如下:
- (void)setBirthdayFieldKeyboard
{
//
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
_datePicker = datePicker;
// 只显示时间
datePicker.datePickerMode = UIDatePickerModeDate;
// 显示中文
datePicker.locale = [NSLocalelocaleWithLocaleIdentifier:@"zh"];
// 监听值得改变
[datePicker addTarget:selfaction:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
self.birthdayField.inputView = datePicker;
}
在程序加载时进行设定
- (void)viewDidLoad {
[superviewDidLoad];
[selfsetBirthdayFieldKeyboard];
}
然后对UITextField的一些属性进行设置,比如说不能输入日期,只能选择显示日期。可以在以下代理方法中实现
#pragma mark - textField代理方法
// 是否允许修改填充字符串
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
returnNO;
}
当然使用之前要指定代理并遵守协议。
然后再选择过时间后,同步更新到文本输入框中,这里需要监听控件的valueChanged的方法
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
响应方法
- (void)datePickerValueChanged:(UIDatePicker *)datePicker
{
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
// 格式化日期格式
formatter.dateFormat = @"yyyy-MM-dd";
NSString *date = [formatter stringFromDate:datePicker.date];
// 显示时间
self.birthdayField.text = date;
}
最后要设置以下UITextField控件的默认值,默认显示0行0列的值
在改变文本输入框状态时进行设置默认值。
// 是否允许开始编辑(代理方法)
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
// 添加自定义窗口
[selfdatePickerValueChanged:self.datePicker];
}
2、UIPickerView使用 先将城市选择键盘添加到文本输入框
// 设置城市键盘
- (void)setCitiesFieldKeyboard
{
//
UIPickerView *picker = [[UIPickerViewalloc] init];
_cityPicker = picker;
picker.dataSource = self;
picker.delegate = self;
self.cityField.inputView = picker;
}
设置代理和数据源为控制器,实现响应的方法
#pragma mark UIPickerView 数据源
// 列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
// 某一列行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0)// 省会
{
return self.provinces.count;
}
else// 其他城市
{
SLQProvince *pro = self.provinces[_proIndex];
return pro.cities.count;
}
}
代理方法 #pragma mark UIPickerView 代理
// 每行的标题
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0)// 省会
{
// 获取省会
SLQProvince *pro = self.provinces[row];
return pro.name;
}
else// 其他城市
{

SLQProvince *pro = self.provinces[_proIndex];
return pro.cities[row];
}
}
// 是否选中某行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
// 滚动省会刷新城市
if(component == 0)
{
// 记录当前省会
_proIndex = [pickerView selectedRowInComponent:0];
[pickerView reloadComponent:1];
}

// 获取选中省会
SLQProvince *pro = self.provinces[_proIndex];
NSInteger cityIndex = [pickerView selectedRowInComponent:1];
NSString *cityName = pro.cities[cityIndex];
_cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];
}
然后在文本输入框的代理方法中添加默认显示对象
// 是否允许开始编辑
【IOS笔记045-UIDatePicker和UIPickerView】- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if (textField == self.birthdayField)
{
// 添加自定义窗口
[selfdatePickerValueChanged:self.datePicker];
}
else
{
[selfpickerView:self.cityPickerdidSelectRow:0inComponent:0]; // 默认显示0行0列
}
}
效果
IOS笔记045-UIDatePicker和UIPickerView
文章图片



主要代码参考
IOS笔记045-UIDatePicker和UIPickerView
文章图片
IOS笔记045-UIDatePicker和UIPickerView
文章图片

1 // 2 //ViewController.m 3 //KVC实现原理 4 // 5 //Created by Christian on 15/6/9. 6 //Copyright (c) 2015年 slq. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "SLQProvince.h" 11 @interface ViewController () 12 13 @property (nonatomic,weak) UIDatePicker *datePicker; 14 @property (nonatomic, weak) UIPickerView *cityPicker; 15 @property (nonatomic, strong) NSMutableArray *provinces; 16 17 @property (nonatomic, assign) NSInteger proIndex; 18 19 @end 20 21 @implementation ViewController 22 23 24 // 懒加载省会 25 - (NSMutableArray *)provinces 26 { 27if (_provinces == nil) { 28// 装所有的省会 29_provinces = [NSMutableArray array]; 30 31// 加载plist文件 32NSString *filePath = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil]; 33NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; 34 35for (NSDictionary *dict in arr) { 36// 字典转模型 37SLQProvince *p = [SLQProvince provinceWithDict:dict]; 38 39[_provinces addObject:p]; 40} 41} 42return _provinces; 43 } 44 45 - (void)viewDidLoad { 46[super viewDidLoad]; 47 48// 49self.birthdayField.delegate = self; 50self.cityField.delegate = self; 51// 52[self setBirthdayFieldKeyboard]; 53[self setCitiesFieldKeyboard]; 54 55 } 56 57 #pragma mark - textField代理方法 58 // 是否允许修改填充字符串 59 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 60 { 61return NO; 62 } 63 // 是否允许开始编辑 64 - (void)textFieldDidBeginEditing:(UITextField *)textField 65 { 66if (textField == self.birthdayField) 67{ 68// 添加自定义窗口 69[self datePickerValueChanged:self.datePicker]; 70} 71else 72{ 73[self pickerView:self.cityPicker didSelectRow:0 inComponent:0]; 74} 75 } 76 77 #pragma mark - UIPickerView 78 #pragma mark UIPickerView 数据源 79 // 列数 80 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 81 { 82return 2; 83 } 84 // 某一列行数 85 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 86 { 87if (component == 0)// 省会 88{ 89return self.provinces.count; 90} 91else// 其他城市 92{ 93SLQProvince *pro = self.provinces[_proIndex]; 94return pro.cities.count; 95} 96 } 97 98 #pragma mark UIPickerView 代理 99 // 每行的标题 100 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 101 { 102if (component == 0)// 省会 103{ 104// 获取省会 105SLQProvince *pro = self.provinces[row]; 106return pro.name; 107} 108else// 其他城市 109{ 110 111SLQProvince *pro = self.provinces[_proIndex]; 112return pro.cities[row]; 113} 114 } 115 // 是否选中某行 116 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 117 { 118// 滚动省会刷新城市 119if(component == 0) 120{ 121// 记录当前省会 122_proIndex = [pickerView selectedRowInComponent:0]; 123[pickerView reloadComponent:1]; 124} 125 126// 获取选中省会 127SLQProvince *pro = self.provinces[_proIndex]; 128NSInteger cityIndex = [pickerView selectedRowInComponent:1]; 129NSString *cityName = pro.cities[cityIndex]; 130_cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName]; 131 } 132 133 134 #pragma mark - 自定义方法 135 // 设置城市键盘 136 - (void)setCitiesFieldKeyboard 137 { 138// 139UIPickerView *picker = [[UIPickerView alloc] init]; 140_cityPicker = picker; 141picker.dataSource = self; 142picker.delegate = self; 143self.cityField.inputView = picker; 144 } 145 146 // 设置生日键盘 147 - (void)setBirthdayFieldKeyboard 148 { 149// 150UIDatePicker *datePicker = [[UIDatePicker alloc] init]; 151_datePicker = datePicker; 152// 只显示时间 153datePicker.datePickerMode = UIDatePickerModeDate; 154// 显示中文 155datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"]; 156// 监听值得改变 157[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; 158self.birthdayField.inputView = datePicker; 159 } 160 161 - (void)datePickerValueChanged:(UIDatePicker *)datePicker 162 { 163NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 164// 格式化日期格式 165formatter.dateFormat = @"yyyy-MM-dd"; 166NSString *date = [formatter stringFromDate:datePicker.date]; 167// 显示时间 168self.birthdayField.text = date; 169 } 170 @end

代码参考















注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。
转载于:https://www.cnblogs.com/songliquan/p/4564963.html

    推荐阅读