關于實時監(jiān)聽UITextField的輸入

UITextField 作為iOS 中一個很基本的原生控件,使用的還是比較廣泛的.

通過@protocol ?UITextFieldDelegate 提供的一些協(xié)議方法我們可我們科技檢測執(zhí)行一些操作

- (void)textFieldDidBeginEditing:(UITextField *)textField 這個方法只有在開始編輯的時候調用,一般是只調用一次

- (void)textFieldDidEndEditing:(UITextField *)textField 這個方法只有在結束編輯傳的時候才會調用,一般是只調用一次


但是如果我要實時檢測文本輸入內容的而改變一般會有以下幾種方法

1? 通過UITextFieldDelegate協(xié)議的提供的方法

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

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

// return NO;??? //如果NO就不會顯示文本內容

return YES; ? ?

}

//但是這個方法會有個弊端 當選擇聯(lián)想輸入的字符的時候 會出現(xiàn)問題

2 通過添加綁定事件來實現(xiàn)檢測

[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);

?}

}

//執(zhí)行結果

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: 鮮

發(fā)現(xiàn)問題沒?第一句打印執(zhí)行了兩次? 第二句打印執(zhí)行了一次 ,UITextRange * selectedRange = [textFiled markedTextRange];這個是獲取到未選中的部分,也就是你輸入的部分

而 這個 UITextRange *selectedRange = [textField markedTextRange];是獲取到選中的高亮部分 ?

這兩個是有區(qū)別的? 如果不做判斷直接執(zhí)行第二個打印語句 發(fā)現(xiàn)也會執(zhí)行2次 也就是說這個textContentChanged 會被執(zhí)行兩次,對于我們的一些操作會產生一些影響,如果加上判斷 就能保證 輸入的內容每次改變,判斷內的語句只執(zhí)行一次

3 添加文本框改變通知

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

Change:) name:UITextFieldTextDidChangeNotification object:searchText];

- (void)textChange :(NSNotification*)notice

{

NSLog(@"調用了");

}

//同上面也要判斷markedTextRange 是不是為nil ?不然方法也會執(zhí)行2次

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容