如图所示:
在开发中,一般都要监听账号对应的输入文本框和密码对应的文本框同时有值,才能让登录按钮可以点击,这个时候就有两种办法了,一种是通过UITextFieldDelegate方法监听,一种是通过addTarget方法监听,可能大多数人有和笔者相同的疑问,是不是都可以呢?那么笔者通过实验来说明情况:
首先通过UITextFieldDelegate方式监听
//当账号与密码同时有值,登录按钮才能够点击
self.accountTextF.delegate = self;
self.pwdTextF.delegate = self;
点击文本框的时候会自动调用该方法
//是否允许改变文字.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSLog(@"accountTextF==%@",self.accountTextF.text);
NSLog(@"----%@",string);
if (self.accountTextF.text.length && self.pwdTextF.text.length) {
self.loginBtn.enabled = YES;
}else {
self.loginBtn.enabled = NO;
}
return YES;
}
- 上面笔者把账号对应的属性里面保存的值self.accountTextF.text,和string的值打印了一下,如图所示,
细心的读者可能已经发现了,值不一样,不同步,self.accountTextF.text的值比string的值慢了一拍,这样就不行了,为什么因为如果我通过每个文本框的长度去判断有没有值的时候,比如我就在账号文本框里面输入了一个字符
a
,按道理,我的账号文本框的长度应该是1,可是刚刚通过打印,发现长度应该是0,那么在里面进行一些逻辑业务的判断是错误的,好了,接下来看addTarget方式通过addTarget方式监听
[self.accountTextF addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
[self.pwdTextF addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
//当文本内容改变时调用
- (void)textChange
{
NSLog(@"accountTextF==%@",self.accountTextF.text);
//当账号与密码同时有值,登录按钮才能够点击
self.loginBtn.enabled = self.accountTextF.text.length && self.pwdTextF.text.length;
}
效果图片:
看到没有,账号文本框中输入一个字符
a,控制台就打印一个字符
a,两者保持同步,所以在里面进行一些逻辑业务的判断,没有问题,所以最终结论是,只能用addTarget方式,不能用UITextFieldDelegate方式,谢谢大家