这是两种可以上下滚动的控件。
这是UIDatePicker,可以显示日期和时间。
这个是UIPickerView,显示类似几个选择项的界面。
注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。
做一个简单界面进行练习。单击生日输入框弹出自定义UIDatePicker,单击城市弹出自定义UIPickerView选择城市。
1、UIDatePicker使用
在点击过文本输入框后弹出日期选中键盘。需要给UITextField控件的inutView属性指定需要显示的界面。
这里显示的代码如下:
- (void)setBirthdayFieldKeyboard
{
//
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
_datePicker
// 只显示时间
datePicker.datePickerMode = UIDatePickerModeDate;
// 显示中文
datePicker.locale = [NSLocalelocaleWithLocaleIdentifier:@"zh"];
// 监听值得改变
[datePicker addTarget:selfaction:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
self.birthdayField.inputView
}
在程序加载时进行设定
- (void)viewDidLoad {
[superviewDidLoad];
[selfsetBirthdayFieldKeyboard];
}
然后对UITextField的一些属性进行设置,比如说不能输入日期,只能选择显示日期。可以在以下代理方法中实现
#pragma mark - textField代理方法
// 是否允许修改填充字符串
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString
{
returnNO;
}
当然使用之前要指定代理并遵守协议。
然后再选择过时间后,同步更新到文本输入框中,这里需要监听控件的valueChanged的方法
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
响应方法
- (void)datePickerValueChanged:(UIDatePicker
{
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
// 格式化日期格式
dateFormat = @"yyyy-MM-dd";
NSString *date = [formatter stringFromDate:datePicker.date];
// 显示时间
self.birthdayField.text
}
最后要设置以下UITextField控件的默认值,默认显示0行0列的值
在改变文本输入框状态时进行设置默认值。
// 是否允许开始编辑(代理方法)
- (void)textFieldDidBeginEditing:(UITextField
{
// 添加自定义窗口
[selfdatePickerValueChanged:self.datePicker];
}
2、UIPickerView使用
先将城市选择键盘添加到文本输入框
// 设置城市键盘
- (void)setCitiesFieldKeyboard
{
//
UIPickerView *picker = [[UIPickerViewalloc] init];
_cityPicker
dataSource = self;
delegate = self;
self.cityField.inputView
}
设置代理和数据源为控制器,实现响应的方法
#pragma mark UIPickerView 数据源
// 列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView
{
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];
reloadComponent:1];
}
// 获取选中省会
SLQProvince *pro = self.provinces[_proIndex];
NSInteger cityIndex = [pickerView selectedRowInComponent:1];
NSString *cityName = pro.cities[cityIndex];
_cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];
}
然后在文本输入框的代理方法中添加默认显示对象
// 是否允许开始编辑
- (void)textFieldDidBeginEditing:(UITextField
{
if (textField == self.birthdayField)
{
// 添加自定义窗口
[selfdatePickerValueChanged:self.datePicker];
}
else
{
[selfpickerView:self.cityPickerdidSelectRow:0inComponent:0]; // 默认显示0行0列
}
}
效果
主要代码参考
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 () <UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
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 {
27 if (_provinces == nil) {
28 // 装所有的省会
29 _provinces = [NSMutableArray array];
30
31 // 加载plist文件
32 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];
33 NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
34
35 for (NSDictionary *dict in arr) {
36 // 字典转模型
37 SLQProvince *p = [SLQProvince provinceWithDict:dict];
38
39 [_provinces addObject:p];
40 }
41 }
42 return _provinces;
43 }
44
45 - (void)viewDidLoad {
46 [super viewDidLoad];
47
48 //
49 self.birthdayField.delegate = self;
50 self.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 {
61 return NO;
62 }
63 // 是否允许开始编辑
64 - (void)textFieldDidBeginEditing:(UITextField *)textField
65 {
66 if (textField == self.birthdayField)
67 {
68 // 添加自定义窗口
69 [self datePickerValueChanged:self.datePicker];
70 }
71 else
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 {
82 return 2;
83 }
84 // 某一列行数
85 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
86 {
87 if (component == 0) // 省会
88 {
89 return self.provinces.count;
90 }
91 else // 其他城市
92 {
93 SLQProvince *pro = self.provinces[_proIndex];
94 return pro.cities.count;
95 }
96 }
97
98 #pragma mark UIPickerView 代理
99 // 每行的标题
100 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
101 {
102 if (component == 0) // 省会
103 {
104 // 获取省会
105 SLQProvince *pro = self.provinces[row];
106 return pro.name;
107 }
108 else // 其他城市
109 {
110
111 SLQProvince *pro = self.provinces[_proIndex];
112 return pro.cities[row];
113 }
114 }
115 // 是否选中某行
116 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
117 {
118 // 滚动省会刷新城市
119 if(component == 0)
120 {
121 // 记录当前省会
122 _proIndex = [pickerView selectedRowInComponent:0];
123 [pickerView reloadComponent:1];
124 }
125
126 // 获取选中省会
127 SLQProvince *pro = self.provinces[_proIndex];
128 NSInteger cityIndex = [pickerView selectedRowInComponent:1];
129 NSString *cityName = pro.cities[cityIndex];
130 _cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];
131 }
132
133
134 #pragma mark - 自定义方法
135 // 设置城市键盘
136 - (void)setCitiesFieldKeyboard
137 {
138 //
139 UIPickerView *picker = [[UIPickerView alloc] init];
140 _cityPicker = picker;
141 picker.dataSource = self;
142 picker.delegate = self;
143 self.cityField.inputView = picker;
144 }
145
146 // 设置生日键盘
147 - (void)setBirthdayFieldKeyboard
148 {
149 //
150 UIDatePicker *datePicker = [[UIDatePicker alloc] init];
151 _datePicker = datePicker;
152 // 只显示时间
153 datePicker.datePickerMode = UIDatePickerModeDate;
154 // 显示中文
155 datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
156 // 监听值得改变
157 [datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
158 self.birthdayField.inputView = datePicker;
159 }
160
161 - (void)datePickerValueChanged:(UIDatePicker *)datePicker
162 {
163 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
164 // 格式化日期格式
165 formatter.dateFormat = @"yyyy-MM-dd";
166 NSString *date = [formatter stringFromDate:datePicker.date];
167 // 显示时间
168 self.birthdayField.text = date;
169 }
170 @end
代码参考
注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。