這是兩種可以上下滾動的控件。
這是UIDatePicker,可以顯示日期和時間。
這個是UIPickerView,顯示類似幾個選擇項的界面。
注意點:PickerView的高度不能改,默認162,PickerView里面每行的高度 可以改,不要弄混淆了。
做一個簡單界面進行練習。單擊生日輸入框彈出自定義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];
}
然后在文本輸入框的代理方法中添加默認顯示對象
// 是否允許開始編輯
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
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里面每行的高度 可以改,不要弄混淆了。