UITextField 作為iOS 中一個(gè)很基本的原生控件,使用的還是比較廣泛的.
通過@protocol ?UITextFieldDelegate 提供的一些協(xié)議方法我們可我們科技檢測(cè)執(zhí)行一些操作
- (void)textFieldDidBeginEditing:(UITextField *)textField 這個(gè)方法只有在開始編輯的時(shí)候調(diào)用,一般是只調(diào)用一次
- (void)textFieldDidEndEditing:(UITextField *)textField 這個(gè)方法只有在結(jié)束編輯傳的時(shí)候才會(huì)調(diào)用,一般是只調(diào)用一次
但是如果我要實(shí)時(shí)檢測(cè)文本輸入內(nèi)容的而改變一般會(huì)有以下幾種方法
1? 通過UITextFieldDelegate協(xié)議的提供的方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSLog(@"調(diào)用了代理方法");
// return NO;??? //如果NO就不會(huì)顯示文本內(nèi)容
return YES; ? ?
}
//但是這個(gè)方法會(huì)有個(gè)弊端 當(dāng)選擇聯(lián)想輸入的字符的時(shí)候 會(huì)出現(xiàn)問題
2 通過添加綁定事件來實(shí)現(xiàn)檢測(cè)
[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í)行結(jié)果
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];這個(gè)是獲取到未選中的部分,也就是你輸入的部分
而 這個(gè) UITextRange *selectedRange = [textField markedTextRange];是獲取到選中的高亮部分 ?
這兩個(gè)是有區(qū)別的? 如果不做判斷直接執(zhí)行第二個(gè)打印語句 發(fā)現(xiàn)也會(huì)執(zhí)行2次 也就是說這個(gè)textContentChanged 會(huì)被執(zhí)行兩次,對(duì)于我們的一些操作會(huì)產(chǎn)生一些影響,如果加上判斷 就能保證 輸入的內(nèi)容每次改變,判斷內(nèi)的語句只執(zhí)行一次
3 添加文本框改變通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(text
Change:) name:UITextFieldTextDidChangeNotification object:searchText];
- (void)textChange :(NSNotification*)notice
{
NSLog(@"調(diào)用了");
}
//同上面也要判斷markedTextRange 是不是為nil ?不然方法也會(huì)執(zhí)行2次