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次