? 對(duì)于UITextField
和UITextView
來(lái)說(shuō)很多東西都可以通過(guò)代理來(lái)解決,但是在處理問(wèn)題的時(shí)候往往會(huì)更加精準(zhǔn)的定位,比如僅僅只能輸入多少個(gè)字之類的判斷,則在代理方法中就會(huì)有局限,因?yàn)殒I盤可以輸入多個(gè)后才返給代理的回調(diào),這樣導(dǎo)致在鍵盤上已經(jīng)輸入了很多,但是實(shí)際回調(diào)的時(shí)候往往會(huì)少很多,導(dǎo)致用戶輸入的內(nèi)容過(guò)多而浪費(fèi),原來(lái)用通知去解決這個(gè)問(wèn)題,通知確實(shí)可以完美的解決這個(gè)問(wèn)題,但是每次都要在dealloc
內(nèi)寫入移除的代碼反而覺(jué)得累贅了,后來(lái)發(fā)現(xiàn)了一個(gè)方法,這里特意收藏一下.
? 在UITextField
和UITextView
實(shí)例化完后加入如下方法,就跟UIButton
一樣寫一個(gè)監(jiān)聽,就可以實(shí)現(xiàn),很簡(jiǎn)單吧,具體的原因去谷歌一下為什么,我在這里就不多陳述了.
[tfXxx addTarget:self action:@selector(textFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];
//實(shí)現(xiàn)下面的方法,來(lái)達(dá)到監(jiān)聽的作用
- (void)textFieldEditChanged:(UITextField *)textField{
NSLog(@"輸入的內(nèi)容: %@",textField.text);
}
? 附上原來(lái)實(shí)現(xiàn)的方法,其實(shí)道理都是一個(gè),只是監(jiān)聽方式不同一個(gè)用的 selector
一個(gè)用的是 Notification
.
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textFieldEditChanged:)
name:UITextFieldTextDidChangeNotification
object:self.tfXxx];
? 關(guān)于UITextView,道理是一樣的將name的參數(shù)換為UITextViewTextDidChangeNotification
即可.
//回調(diào)
-(void)textFieldEditChanged:(NSNotification *)obj{
BOOL isTextFiledTextCount = NO;
UITextView *textView = (UITextView *)obj.object;
NSString *toBeString = textView.text;
UITextRange *selectedRange = [textView markedTextRange];
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
if (!position) {
if (toBeString.length > 15) {
self.titleText.text = [toBeString substringToIndex:15];
isTextFiledTextCount = YES;
}
if (isTextFiledTextCount==YES) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"最多輸入15個(gè)漢字" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
[alert show];
isTextFiledTextCount = NO;
}
}
}
? 本質(zhì)是監(jiān)聽UIControlEventEditingChanged
這一個(gè)類型的枚舉