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

第二部、实现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;
}
时间: 2024-11-05 08:30:06

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

IOS开发之自定义系统弹出键盘上方的view

IOS开发之自定义系统弹出键盘上方的view 分类: IOS 2014-11-18 09:26 1304人阅读 评论(0) 收藏 举报 目录(?)[+] 这篇文章解决的一个开发中的实际问题就是:当弹出键盘时,自定义键盘上方的view.目前就我的经验来看,有两种解决方法.一个就是利用 UITextField或者UITextView的inputAccessoryView属性,另一种,就是监听键盘弹出的notification来自 己解决相关视图的位置问题. 第一种解决方法相对比较简单,第二种的方法中

iOS开发- 自动消失的弹出框

- (void)timerFireMethod:(NSTimer*)theTimer//弹出框 { UIAlertView *promptAlert = (UIAlertView*)[theTimer userInfo]; [promptAlert dismissWithClickedButtonIndex:0 animated:NO]; promptAlert =NULL; } - (void)showAlert:(NSString *) _message{//时间 UIAlertView *

点击UITextField弹出日期选择器 iOS

在.h文件里加入UITextFieldDelegate @property(nonatomic,retain) UITextField * phoneNumberTextField;@property(retain,nonatomic)UIDatePicker *datePicker; 在.m文件viewdidload里 UIDatePicker *datePicker=[[UIDatePicker alloc]initWithFrame:CGRectMake(0, [UIScreen main

IOS微信点击input弹出输入法,关闭后页面留白解决方案

场景:IOS用微信点击input框弹出输入法后 不管你是输入信息,还是不输入直接点完成关闭输入法,都会导致页面被挤上去后产生留白,从而改变页面布局             解决方法: 给input添加blur(失去焦点)事件,让页面强制回滚,距离为0,代码如下 $("input").blur(function(){ document.body.scrollTop = document.documentElement.scrollTop = 0; }); 原文出处:https://blo

iOS开发日记15-强制弹出系统键盘(禁用搜狗键盘)

今天博主有一个强制弹出系统键盘的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 起因是在使用搜狗的过程中,使用中文字符标点产生了bug,应该是搜狗的问题.追询一番无果后,决定禁用搜狗键盘,使用系统自带的键盘. 尝试了很多方法,通知,KVO等等,最后找到了一个系统的API,十分的简便,分享给大家. 在AppDelegate中添加如下代码,即可. //强制使用系统键盘 - (BOOL)application:(UIApplication *)application shouldAllow

【android开发】使用PopupWindow实现页面点击顶部弹出下拉菜单

没有太多花样,也没有很复杂的技术,就是简单的PopupWindow的使用,可以实现点击弹出一个自定义的view,view里可以随便设计,常用的可以放一个listview. demo中我只是一个点击展示,简单的使用了fade in out的动画效果,也没有精美的图片资源,看着也丑,不过这么短的时间,让你掌握一个很好用的技术,可以自己扩展,不很好么? 废话不说了,直接上代码: MainActivity.java [java] view plaincopy public class MainActiv

使用jqMobi开发app基础:弹出内容的设计

设计APP,由于屏幕很小,在PC网页山可以放在一体的内容,在APP中就不能放在一起了. 例如如下,项目出勤人员很多,需要弹出一个panel,然后让用户选择,如何设计呢? 项目出勤panel的内容: <div id="shenqingxiangmuchuqing" title="申请项目出勤" class="panel" data-load="loadshenqingxiangmuchuqingDetail" data-t

点击删除弹出提示是否删除代码

点击删除弹出提示是否删除代码:在一些应用中,会有删除功能,比如删除新闻等功能,在这些功能中,当点击删除的时候,一般会弹出提示窗口,提示是否要删除指定的内容,以防止出现误操作现象,下面就通过代码实例介绍一下,如何弹出这个提示窗口.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content=&quo

解决IOS safari在input focus弹出输入法时不支持position fixed的问题

该文章为转载 我们在做移动web应用的时候,常常习惯于使用position:fixed把一个input框作为提问或者搜索框固定在页面底部.但在IOS的safari和webview中,对position:fixed的支持不是很好(在IOS5之前甚至还不支持position:fixed).我遇到的其中一个问题就是,在iOS6+环境下,input focus弹出输入法的时候,设置了position fixed的input框浮在页面上了,而不是吸附在软键盘上.效果如图(图片来源于网上): 而Androi