APP登录时,一般是是等用户输入完账号和密码后才去检查是否为空,而去哪儿登录时,在账号和密码的输入过程中,只要当账号和密码其一为空时,登录按钮立即变成不可用(图1),只有账号和密码均符合要求时,登录按钮才可用(图2)。本文就是来实现这一功能:当登录所需的UITextFiled均不空时登录按钮才有效。

图1-去哪儿APP登录按钮不可用状态

图2-去哪儿APP登录按钮可用状态

要实现这一功能,首先想到的是使用UITextFiledDelegate,要实现哪个方法呢?只要一个方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

这个方式是在用户将要输入或者删除字符,即 Text将要发生改变时,就会被调用,官方的描述为:

Asks the delegate if the specified text should be changed.
The text field calls this method whenever the user types a new character in the text field or deletes an existing character.

注意这里强调了“将要”,所以不能直接在这个方法内根据UITextField的Text的长度来判断输入框是否为空,因为当输入框为空时,此时用户输入一个字符, UITextField.text.length 还是等于0,当用户再输入一个字符,UITextField.text.length的值才会是1(而此时用户看到的输入字符串长度应该是2),原因是这个前面提到的“将要”, shouldChangeCharactersInRange函数是在用户的输入输入到UITextField之前调用的,所以总是“慢半拍”,好了,朋友喊去打球,就不废话了,直接上示例代码。

先是ViewController.h声明了三个输入框用来输入姓名、电话、车牌和一个确定按钮,并实现UITextFiledDelegate代理

@interface MakeOrderViewController : BaseViewController<UITextFieldDelegate>
@property (weak,nonatomic) IBOutlet UIView *textView;
@property (weak,nonatomic) IBOutlet UITextField *nameText;
@property (weak,nonatomic) IBOutlet UITextField *phoneText;
@property (weak, nonatomic) IBOutlet UITextField *carText;
@property (weak,nonatomic) IBOutlet UIButton *OkBtn;
@end

然后是 ViewController.m文件

@interface MakeOrderViewController ()@end@implementation MakeOrderViewController- (void)viewDidLoad {[super viewDidLoad];self.nameText.delegate = self;self.carText.delegate = self;self.phoneText.delegate = self;self.OkBtn.enabled = NO;self.OkBtn.alpha = 0.5;
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{BOOL isOK = YES;//记录用户输入是否合法if (textField!=self.nameText&&self.nameText.text.length==0) {isOK = false;}else if(textField!=self.phoneText&&self.phoneText.text.length==0){isOK = false;}else if(textField!=self.carText&&self.carText.text.length==0){isOK = false;}else if(range.location == 0&&[string isEqualToString:@""]){isOK = false;}if (isOK) {self.OkBtn.alpha = 1;self.OkBtn.enabled = YES;}else{self.OkBtn.alpha = 0.5;self.OkBtn.enabled = NO;}return YES;
}@end

有必要解释下shouldChangeCharactersInRange函数的几个参数

textField  就是当前编辑的UITextFiledrange 是一个结构体,包含用户刚刚输入的字符位置(location)和长度(length)

string 就是用户刚刚输入的字符,如果用户刚刚是按了delete键,string为空

上面的函数的前三个判断,是判断非编辑状态下的输入框(就是没有获得焦点的那两个输入框)的内容是否为空, 最后一个判断range.location == 0&&[string isEqualToString:@""],是为了判断在当前输入框中是否是用户输入字符后点击delete键将某个UITextFiled的字符全部删除的操作,是的话要将按钮设置为不可点击。

效果:

【仿去哪儿登录】UITextField输入时检查输入框是否为空相关推荐

  1. 仿QQ空间登录,解决键盘挡住输入框的问题

    我们在开发Android应用中,登录和注册界面是少不了的,往往在做登录注册的时候如果给界面加一个LOGO,就有可能把用户名和密码框放在手机屏幕的中间或底部,这样当软键盘弹出的时候,就有可能挡住输入框( ...

  2. C语言实现可写入文件的账号密码登录系统,密码输入时掩盖,登录界面菜单选择,更改密码系统,课设必备。

    账号登录系统在很多系统设计时都时必不可少的,今天这个登录系统功能较全,可以注册,登录,找回密码,修改密码,以及在输入密码时会有*将密码掩盖,还有完善地登录选择界面,废话不多,上代码! 目录 1.头文件 ...

  3. SpringBoot 简单实现仿CAS单点登录系统

    SpringBoot 简单实现仿CAS单点登录系统 新境界开源开源SSO项目介绍 新境界开源SSO项目实现原理大致如下: 新境界开源SSO项目登录流程介绍 新境界开源SSO项目授权登录流程介绍 新境界 ...

  4. android 仿微信demo————登录功能实现(移动端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

  5. 仿 手机QQ 登录、注册、找回密码、好友列表、QQ状态等功能的实现

    仿 手机QQ 登录.注册.找回密码.好友列表.QQ状态等功能的实现 全文 图 + 代码 .... 福利!!!(QQ登录背景,过度页面背景) 1.加载过程中的背景 2.登录页面 ==1. 登录页面 布局 ...

  6. markedTextRange理解及使用 计算长度解决中文输入时拼音会显示到文本的问题

    在开发的时候大家有时候会遇见这样的问题:在使用UITextField或UITextView实时实时计算content的长度的时候会出现一些偏差,如何准确的去计算统计这些字符呢? 可以发现UITextF ...

  7. Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现)

    Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现) 目录 Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现) ...

  8. 仿QQ异地登录强制下线功能的实现

    一,仿QQ异地登录强制下线功能 效果:同一个账号,最后一个登录的用户会把前一个登录后的用户顶掉,被迫下线! 1,剖析登录原理 登录的后台逻辑 准备一张账户信息表(账号,密码,是否禁用等字段) 查询账号 ...

  9. Android仿微信朋友圈3评论输入框及点击外部和列表滑动时隐藏输入框和键盘解决方法

    接着上一篇的评论点赞弹框之后,这次来说说微信的评论输入框,点击屏幕外部评论框和键盘消失,滑动列表时输入框和键盘也要消失,这里不是说一定要舔微信啥的,只是单纯从技术角度出发,分析原理和实现,解决我们自己 ...

最新文章

  1. python绘制直方图显示数字_Python实现绘制双柱状图并显示数值功能示例
  2. 在VS2010平台上创建并使用dll
  3. php文件下载脚本,PHP文件下载实例代码浅析
  4. WPF-常用布局容器
  5. 小车主板哪家强?PS2手柄4路电机输出..火魔童主板了解一下?
  6. MS BizSpark计划-免费提供软件和服务
  7. 跨平台---udpclient与udpserver
  8. signature=18441de5a4bb8df92eb5cf5dcca47d1e,Heroísmo y los medios de comunicación (Capítulo 5A 5B)...
  9. 【学习笔记】WQS二分详解及常见理解误区解释
  10. 使用html+css仿搜狐网址页面布局
  11. 【对讲机的那点事】无线电对讲系统在隧道中的应用
  12. 在Linux中,用.swp文件恢复未保存的文件
  13. 制衣软件测试自学,服装检验作业指导书.doc
  14. AlexNet 实现猫狗分类(keras and pytorch)
  15. CF1413A 【Finding Sasuke】
  16. 75-CentOS-Docker构建nginx镜像
  17. 关于vscode中输入的中文变繁体的问题
  18. 全球及中国邮件营销服务行业发展趋势及投资策略分析报告2022-2028年
  19. UML中的九种建模图
  20. 迅视资管 华为哈勃入股中蓝电子,持股7.83%

热门文章

  1. 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()
  2. javascript的call()方法与apply()方法的理解
  3. 第一篇随笔——新的开端
  4. 关于chrome等浏览器不支持showModalDialog的解决方案
  5. 雷观(七):靠谱的程序员,不是随便一个码农就可以做到的
  6. 编程以外积累: 如何给项目生成类似VS2008的说明文档
  7. Linux 终端命令行提示符的艺术--PS1进阶
  8. google breakpad native crash分析工具
  9. C++/C++11中std::queue的使用
  10. 【网络编程】epoll 笔记