鍵盤處理例子思路
來源:程序員人生 發布時間:2014-12-13 09:23:24 閱讀次數:3019次
鍵盤處理例子思路
步驟1:簡單搭建界面
步驟2、自定義XIB,用來描寫性別
+ (id)sexBox
{
return [[NSBundle mainBundle] loadNibNamed:@"MJSexBox"
owner:nil
options:nil][0];
}
2.1監聽性別按鈕點擊,修改按鈕的狀態
#pragma mark
改變了性別選擇
- (IBAction)sexChange {
if (_manBtn.enabled) {
//
點擊了男的
_manBtn.enabled =
NO;
_womanBtn.enabled =
YES;
}
else {
//
點擊了女的
_manBtn.enabled =
YES;
_womanBtn.enabled =
NO;
}
}
2.2.在控制器中添加性別選擇控件
MJSexBox *sexBox = [MJSexBox sexBox];
sexBox.center = CGPointMake(150, 70);
[self.view addSubview:sexBox];
步驟3:自定義鍵盤
3.1.設置生日鍵盤
// 1.1.生日
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.datePickerMode = UIDatePickerModeDate;
//
只顯示日期5
datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
[datePicker addTarget:self
action:@selector(birthdayChange:) forControlEvents:UIControlEventValueChanged];
_birthdayField.inputView = datePicker;
//
設置鍵盤為日期選擇控件
_birthdayField.delegate =
self;
3.2制止生日鍵盤輸入文字
#pragma mark - UITextField代理
#pragma mark
每當用戶輸入文字的時候就會調用這個方法,返回NO,制止輸入;但會YES,允許輸入
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
return
NO;
}
3.3
監聽生日鍵盤的值改變事件
#pragma mark -
生日改變
- (void)birthdayChange:(UIDatePicker *)picker
{
// 1.獲得當前時間
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat =
@"yyyy-MM-dd";
NSString *time = [fmt stringFromDate:picker.date];
// 2.賦值到文本框
_birthdayField.text = time;
}
步驟4、設置城市
4.1用xib描寫城市鍵盤,并且設置UIPickerView的代理和數據源,創建自定義視圖。
+ (id)cityPicker
{
return [[NSBundle mainBundle] loadNibNamed:@"MJCityPicker"
owner:nil
options:nil][0];
}
4.2加載數據,在awakeFromNib中調用
#pragma mark
任何對象從xib中創建終了的時候都會調用1次
- (void)awakeFromNib
{
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities.plist"
ofType:nil]];
_provinces = [NSMutableArray array];
for (NSDictionary *dict
in array) {
MJProvince *p = [MJProvince provinceWithDict:dict];
[_provinces addObject:p];
}
}
4.3實現數據源和代理方法。
#pragma mark - UIPickerView數據源方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return
2;
}
#pragma mark
第component列有多少行數據
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component ==
0) {
//
多少個省分
return _provinces.count;
}
else {
//
當前選中省分的行數(城市個數)
// 1.取得選中了哪個省
int pIndex = [pickerView selectedRowInComponent:0];
// 2.取出省分模型
MJProvince *p = _provinces[pIndex];
// 3.返回當前省分城市的個數
return p.cities.count;
}
}
#pragma mark - UIPickerView代理方法
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component ==
0) {
//顯示哪一個省分
// 1.取出省分模型
MJProvince *p = _provinces[row];
// 2.取出省分名稱
return p.name;
}
else {
//
顯示哪一個城市
// 1.取得選中了哪個省
int pIndex = [pickerView selectedRowInComponent:0];
// 2.取出省分模型
MJProvince *p = _provinces[pIndex];
// 3.返回對應行的城市名稱
return p.cities[row];
}
}
#pragma mark
監聽選中了某1列的某1行
- (void)pickerView:(UIPickerView *)pickerView
didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (component ==
0) {
//
改變了省分
//
刷新第1列的數據(重新刷新數據,重新調用數據源和代理的相應方法取得數據)
[pickerView reloadComponent:1];
//
選中第1列的第0行
[pickerView selectRow:0
inComponent:1
animated:YES];
}
//
更改文字
// 1.取得選中的省分名稱
int pIndex = [pickerView selectedRowInComponent:0];
MJProvince *p = _provinces[pIndex];
// 2.取得選中的城市位置
int cIndex = [pickerView selectedRowInComponent:1];
// 3.通知代理
if ([_delegate respondsToSelector:@selector(cityPicker:citySelectWithProvince:city:)])
{
[_delegate cityPicker:self
citySelectWithProvince:p.name city:p.cities[cIndex]];
}
}
4.4調用自定義視圖設置城市鍵盤
設置城市
MJCityPicker *cityPicker = [MJCityPicker cityPicker];
cityPicker.delegate =
self;
_cityField.inputView = cityPicker;
//
設置鍵盤為pickerview
_cityField.delegate =
self;
#pragma mark - MJCityPicker代理方法
#pragma mark
選中了某個城市就會調用
- (void)cityPicker:(MJCityPicker *)cityPicker
citySelectWithProvince:(NSString *)province city:(NSString *)city
{
_cityField.text = [NSString stringWithFormat:@"%@ %@", province, city];
}
4.5
給自定義城市鍵盤聲明1個協議,并添加1個代理屬性,當轉動鍵盤的時候,通知代理做些事情.
@protocol
MJCityPickerDelegate <NSObject]]>
@optional
- (void)cityPicker:(MJCityPicker *)cityPicker citySelectWithProvince:(NSString *)province city:(NSString
*)city;
@end
4.6
在控制器中實現代理協議的方法。
#pragma mark - MJCityPicker代理方法
#pragma mark
選中了某個城市就會調用
- (void)cityPicker:(MJCityPicker *)cityPicker
citySelectWithProvince:(NSString *)province city:(NSString *)city
{
_cityField.text = [NSString stringWithFormat:@"%@ %@", province, city];
}
步驟5:工具條
5.1自定義1個xib描寫工具條
+ (id)keyboardTool
{
return [[NSBundle mainBundle] loadNibNamed:@"MJKeyboardTool"
owner:nil
options:nil][0];
}
5.2將toolbar用view包裝起來,目的不讓外界修改toolbar,由于外界拿到的是UIView,而不是toolbar,就不能直接獲得toolbar里面的屬性了。
5.3自定義1個自定義工具條類,和xib綁定。
- (IBAction)previous;
//
上1個
- (IBAction)next;
//
下1個
- (IBAction)done;
//
完成
5.4 定義1個協議,通知代理按鈕點擊事件
@optional
- (void)keyboardTool:(MJKeyboardTool *)keyboardTool itemClick:(MJKeyboardToolItemType)itemType;
@end
5.5定義1個枚舉類型,辨別按鈕
typedef
enum {
MJKeyboardToolItemTypePrevious,
//
上1個
MJKeyboardToolItemTypeNext,
//
下1個
MJKeyboardToolItemTypeDone
//
完成
} MJKeyboardToolItemType;
5.6當點擊按鈕時,通知代理
#pragma mark
上1個
- (void)previous
{
//
通知代理(上1個按鈕被點擊了)
if ([_delegate respondsToSelector:@selector(keyboardTool:itemClick:)])
{
[_delegate keyboardTool:self
itemClick:MJKeyboardToolItemTypePrevious];
}
}
#pragma mark
下1個
- (void)next
{
//
通知代理(下1個按鈕被點擊了)
if ([_delegate respondsToSelector:@selector(keyboardTool:itemClick:)])
{
[_delegate keyboardTool:self
itemClick:MJKeyboardToolItemTypeNext];
}
}
#pragma mark
完成
- (void)done
{
//
通知代理(完成按鈕被點擊了)
if ([_delegate respondsToSelector:@selector(keyboardTool:itemClick:)])
{
[_delegate keyboardTool:self
itemClick:MJKeyboardToolItemTypeDone];
}
}
5.7 讓控制器作為工具條的代理,并實現工具條代理方法
#pragma mark - MJKeyboardTool代理方法
#pragma mark
點擊了工具條上面的按鈕就會調用
- (void)keyboardTool:(SUNKeyboardTool
*)keyboardTool itemClick:(SUNKeyboardToolItemType)itemType
{
if (itemType ==
doneKeyboardToolItemType) {
[self.view
endEditing:YES];
}else{
int index = [_fields
indexOfObject:_focusedField];
if (itemType ==
previousKeyboardToolItemType) {
index--;
}else{
index++;
}
//
變成第1響應者
[_fields[index]
becomeFirstResponder];
}
}
5.8
監聽所有文本框的開始編輯,設置所有文本框的代理為控制器
// 3.取得所有的文本輸入框
MJKeyboardTool *tool = [MJKeyboardTool keyboardTool];
tool.delegate =
self;
for
(UIView *child
in
self.view.subviews) {
//
如果是文本輸入框,就設置工具條
if ([child isKindOfClass:[UITextField class]]) {
UITextField *field = (UITextField *)ch
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
------分隔線----------------------------
------分隔線----------------------------