一聚教程网:一个值得你收藏的教程网站

热门教程

iOS如何实现点击UITextField弹出UIDatePicker日期选择器

时间:2022-11-14 22:14:18 编辑:袖梨 来源:一聚教程网

UITextField是用来接受用户输入的控件,它的优点是灵活性大,用户可以随便输入,但有时候这也是其缺点。对我们而言,典型的一个问题就是格式检查。然而我们也会遇到想让用户输入日期的时候,这个时候再进行格式检查就有些小题大做了,毕竟iOS已经为我们提供了一个UIDatePicker来进行日期选择,这样一个很自然的想法就是当用户点击UITextField的时候弹出的不是键盘,而是我们的UIDatePicker。这里会用到知识点有TextField的协议、UIView动画等。现在我们来实现以下这个功能。

假定我们有多个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;
}

热门栏目