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];
第二部、实现UIDatePicker的事件
这里我们设置的动作是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; }
第三步、实现UITextField的-textFieldShouldBeginEditing:方法,在该方法中处理键盘和UIDatePicker的弹出逻辑
该方法的原型是- (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; }