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
@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 就是当前编辑的UITextFiled
range 是一个结构体,包含用户刚刚输入的字符位置(location)和长度(length)
string 就是用户刚刚输入的字符,如果用户刚刚是按了delete键,string为空
上面的函数的前三个判断,是判断非编辑状态下的输入框(就是没有获得焦点的那两个输入框)的内容是否为空, 最后一个判断range.location == 0&&[string isEqualToString:@""],是为了判断在当前输入框中是否是用户输入字符后点击delete键将某个UITextFiled的字符全部删除的操作,是的话要将按钮设置为不可点击。
效果: