关于实时监听UITextField的输入

字数 555阅读 1995

UITextField 作为iOS 中一个很基本的原生控件,使用的还是比较广泛的.

通过@protocol  UITextFieldDelegate 提供的一些协议方法我们可我们科技检测执行一些操作

- (void)textFieldDidBeginEditing:(UITextField *)textField 这个方法只有在开始编辑的时候调用,一般是只调用一次

- (void)textFieldDidEndEditing:(UITextField *)textField 这个方法只有在结束编辑传的时候才会调用,一般是只调用一次


但是如果我要实时检测文本输入内容的而改变一般会有以下几种方法

1  通过UITextFieldDelegate协议的提供的方法

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

NSLog(@"调用了代理方法");

// return NO;    //如果NO就不会显示文本内容

return YES;    

}

//但是这个方法会有个弊端 当选择联想输入的字符的时候 会出现问题

2 通过添加绑定事件来实现检测

[searchText addTarget:self action:@selector(textContentChanged:) forControlEvents:UIControlEventEditingChanged];

-(void)textContentChanged:(UITextField*)textFiled

{

NSLog( @"text changed11: %@", textFiled.text);

UITextRange * selectedRange = [textFiled markedTextRange];

if(selectedRange == nil || selectedRange.empty){

NSLog( @"text changed222: %@", textFiled.text);

 }

}

//执行结果

2017-07-10 14:04:26.397 NanNiWan[7734:166059] text changed11: 鲜

2017-07-10 14:04:26.397 NanNiWan[7734:166059] text changed11: 鲜

2017-07-10 14:04:26.398 NanNiWan[7734:166059] text changed22: 鲜

发现问题没?第一句打印执行了两次  第二句打印执行了一次 ,UITextRange * selectedRange = [textFiled markedTextRange];这个是获取到未选中的部分,也就是你输入的部分

而 这个 UITextRange *selectedRange = [textField markedTextRange];是获取到选中的高亮部分  

这两个是有区别的  如果不做判断直接执行第二个打印语句 发现也会执行2次 也就是说这个textContentChanged 会被执行两次,对于我们的一些操作会产生一些影响,如果加上判断 就能保证 输入的内容每次改变,判断内的语句只执行一次

3 添加文本框改变通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(text

Change:) name:UITextFieldTextDidChangeNotification object:searchText];

- (void)textChange :(NSNotification*)notice

{

NSLog(@"调用了");

}

//同上面也要判断markedTextRange 是不是为nil  不然方法也会执行2次

推荐阅读更多精彩内容