UITextField的本身的方法主要是针对输入框本身的操作,真正的对输入框里面的内容和事件的监听是通过UITextFieldDelegate来实现的。
代理方法
我们既然需要代理来监听事件,我们就需要完成设置代理的三大步
一、首先要让需要代理的类遵守代理类的协议,这里是UITextFieldDelegate
二、然后在需要代理的类中说明代理返回的结果给谁 ,这里是 self.text.delegate = self; 当前这个UITextField的delegate就是代理,我们需要将它返回的值给我的当前对象。 (这一步很重要,如果没有设置,当前对象是得不到值的,并且编译器是不会提示的)
三、最后在需要代理的类中实现协议中的方法,由于UITextFieldDelegate中的方法都是optinal 的所以我们只选用用得到的方法进行实现。
//配置是否可以输入
//当[textField becomeFirstResponder]之前会调用这个方法
//YES 可以编辑 可以成为第一响应者
//NO 不可以编辑 不能成为第一响应者
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
NSLog(@"是否可以开始编辑");
return YES;
}
这个方法是第一个方法,它表明这个输入框可以输入内容吗,当调用这个方法之前,我们是不可以编辑的,当这个方法调用时,系统就会去调用 [textField becomeFirstResponder] 这个方法,把当前这个控件作为第一响应者。反映到我们就是我们点击那个控件,我们可以输入了。这个方法的返回值是BOOL类型,如果返回YES就说明可以开始编辑了,然后就会去调用[textField becomeFirstResponder]。如果返回NO就说明还不可以编辑就不会去调用[textField becomeFirstResponder],此时点击控件也不会有任何反应。
//开始编辑了 点击输入框 即将开始输入内容
- (void)textFieldDidBeginEditing:(UITextField *)textField{
NSLog(@"开始编辑 textFieldDidBeginEditing ");
}
这个方法是在上面那个方法返回值是YES的情况下才会调用的,如果有需要在这个时候做的操作,我们就应该在这个里面写代码。
//配置是否可以取消第一响应者 是否可以停止输入内容
//当textField resignFirstResponder之前会调用这个方法
//YES 可以取消第一响应者
//NO 不可以取消 一直等待输入
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
NSLog(@"是否可以停止输入");
return YES;
}
当调用这个方法之前,我们还处于编辑状态,调用了这个方法之后,如果返回值是YES,系统就会去调用 [textFiled resignFirstResponder] 取消当前控件的第一响应者,当然这取决于我们把取消第一响应者的方法写在哪里,如果写在点击开始事件里面,当我们点击其他地方时,就会调用取消第一响应者的方法,此时键盘撤下,输入框中的光标不显示,输入结束了。如果返回NO,就不回去调用 [textFiled resignFirstResponder] 方法,此时输入停不下来了。
//停止编辑了
- (void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"停止编辑了");
}
同样,这个方法是在上面那个方法返回值是YES的时候才会执行的。
//键盘上的return按钮被点击了
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"键盘上的return键被点击了");
return YES;
}
当键盘上的return按钮被点击的时候,就会来执行这个事件。
//实时监听textField上文本内容的改变
//string 新输入的字符
//即将用新输入的字符来拼接字符串 注意还没有拼接
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//原来显示的内容
NSLog(@"改变之前的内容:%@", textField.text);
//新的内容=用string去替换text上range范围的内容
NSString *newStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"即将显示的内容:%@", newStr);
return YES;
}
@end
这个方法是比较重要的方法,当用到UITextField的时候,我们一般都要获取到输入框中的数据,所以我们一般都会去实现这个方法。代理通过去调用这个方法来返回给我们相应的值。每当我们点击键盘上的一个字符时,代理就会将我们的输入作为这个方法的第二个参数,第一个参数就是现在的这个输入框,然后调用这个方法,我们需要在这里实现如何将代理传递给我们的数据整理成我们想要的数据(一般牵涉到字符串中的操作),值得注意的是,如果我们直接获取不整理,那么就会导致始终少一个字符,比如:
输入框中显示的:123456
实际上获取的:12345
这是因为这个方法是即将用新输入的字符来拼接原来的字符,注意获取是获取到了就是还没有拼接,我们输入6的时候光标在6的后面闪烁,此时的字符6还没有被拼接到原来的字符串中。为了解决这个问题,我们使用[textField.text stringByReplacingCharactersInRange:range withString:string],来将这个字符拼接到原来字符串中。