对于UITextField
和UITextView
来说很多东西都可以通过代理来解决,但是在处理问题的时候往往会更加精准的定位,比如仅仅只能输入多少个字之类的判断,则在代理方法中就会有局限,因为键盘可以输入多个后才返给代理的回调,这样导致在键盘上已经输入了很多,但是实际回调的时候往往会少很多,导致用户输入的内容过多而浪费,原来用通知去解决这个问题,通知确实可以完美的解决这个问题,但是每次都要在dealloc
内写入移除的代码反而觉得累赘了,后来发现了一个方法,这里特意收藏一下.
在UITextField
和UITextView
实例化完后加入如下方法,就跟UIButton
一样写一个监听,就可以实现,很简单吧,具体的原因去谷歌一下为什么,我在这里就不多陈述了.
[tfXxx addTarget:self action:@selector(textFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];
//实现下面的方法,来达到监听的作用
- (void)textFieldEditChanged:(UITextField *)textField{
NSLog(@"输入的内容: %@",textField.text);
}
附上原来实现的方法,其实道理都是一个,只是监听方式不同一个用的 selector
一个用的是 Notification
.
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textFieldEditChanged:)
name:UITextFieldTextDidChangeNotification
object:self.tfXxx];
关于UITextView,道理是一样的将name的参数换为UITextViewTextDidChangeNotification
即可.
//回调
-(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个汉字" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
isTextFiledTextCount = NO;
}
}
}
本质是监听UIControlEventEditingChanged
这一个类型的枚举