标签:ios开发 uitextfield uidatepicker
UITextField是用来接受用户输入的控件,它的优点是灵活性大,用户可以随便输入,但有时候这也是其缺点。对我们而言,典型的一个问题就是格式检查。然而我们也会遇到想让用户输入日期的时候,这个时候再进行格式检查就有些小题大做了,毕竟iOS已经为我们提供了一个UIDatePicker来进行日期选择,这样一个很自然的想法就是当用户点击UITextField的时候弹出的不是键盘,而是我们的UIDatePicker。
一个简单地方法是将自己的UIDatePicker直接赋给UITextField的inputView属性,这样还可以为其添加附加视图,并且比较方便。
这里我们用另一种方法实现以下,也就是通过UITextField的协议来实现。这种方法的好处是给了我们更大的灵活性,可以对整个inputView从弹出到使用到结束都能做到自定义。还能熟悉对UITextField的协议的理解。
假定我们有多个UITextField,然后只有其中一个是需要选择日期的(多个的时候可以通过tag等方法来识别,大同小异)。
第一步,初始化。
将各个UITextField的协议都赋好,然后为其中需要弹出日期选择器的单独赋tag值(最好全都赋上,可以结合其他需要灵活调整),然后把一个UIDatePicker空间也给初始化。
示例:
//TextField
self.testTimeField.delegate = self;
self.testNameField.delegate = self;
self.testLocationField.delegate = self;
self.testOtherField.delegate = self;
self.testTimeField.tag = 1001;
self.testNameField.returnKeyType = UIReturnKeyDone;
self.testLocationField.returnKeyType = UIReturnKeyDone;
self.testOtherField.returnKeyType = UIReturnKeyDone;
//UIDatePicker
self.datePicker = [[UIDatePicker alloc] init];
self.datePicker.datePickerMode = UIDatePickerModeDateAndTime;
self.datePicker.minuteInterval = 30;
[self.datePicker addTarget:self action:@selector(chooseDate:) forControlEvents:UIControlEventValueChanged];这里我们设置的动作是ValueChanged也就是说每当日期选择器的值发生变化,即用户选择新的日期时,其绑定事件都会被触发,所以在该方法中为我们的UITextField的text属性赋值即可。
示例;
- (void)chooseDate:(UIDatePicker *)sender {
NSDate *selectedDate = sender.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm";
NSString *dateString = [formatter stringFromDate:selectedDate];
self.testTimeField.text = dateString;
}
该方法的原型是- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;其返回值为布尔类型,当返回YES时键盘会弹出,而返回NO时键盘不会弹出,即textField不会被响应。而我们要做的就是当响应的textField是普通的textField的时候返回YES,而响应的textField是会弹出日期选择器的时候返回NO。怎么判断呢?还记得我们之前设置过的tag值吗?这里就用上了。
另外,这里有几个小问题:1、注意UIDatePicker的及时隐藏,即当显示键盘的时候它不应该再出现在后面了,否则键盘关闭后你会看到一个UIDatePicker赫然立在屏幕上。。
2、同样,将要弹出UIatePicker的时候其他的键盘(如果在响应状态)也应该关闭,这两条的意思是,当用户从一个textField直接点到另一个的时候,我们的应用应该能正确处理键盘和日期选择器的关系。
3、动画的应用。这个比较简单,让日期选择器像键盘一样弹出关闭。
示例:
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
//如果当前要显示的键盘,那么把UIDatePicker(如果在视图中)隐藏
if (textField.tag != 1001) {
if (self.datePicker.superview) {
[self.datePicker removeFromSuperview];
}
return YES;
}
//UIDatePicker以及在当前视图上就不用再显示了
if (self.datePicker.superview == nil) {
//close all keyboard or data picker visible currently
[self.testNameField resignFirstResponder];
[self.testLocationField resignFirstResponder];
[self.testOtherField resignFirstResponder];
//此处将Y坐标设在最底下,为了一会动画的展示
self.datePicker.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, 216);
[self.view addSubview:self.datePicker];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
self.datePicker.bottom -= self.datePicker.height;
[UIView commitAnimations];
}
return NO;
}
iOS开发——点击UITextField弹出UIDatePicker的协议实现方法
标签:ios开发 uitextfield uidatepicker
原文地址:http://blog.csdn.net/u013604612/article/details/42262961