iOS开发——点击UITextField弹出UIDatePicker的协议实现方法

来源:互联网 发布:unity3d dontdestroy 编辑:程序博客网 时间:2024/05/16 07:26

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;}


0 0
原创粉丝点击