实际开发当中很多要用到对UItextfield或者UItextfield输入的监听,限制字数及其他一些处理,但是由于中文输入法的键盘上有联想、推荐的功能,所以使用这两个控件的代理方法可能导致文本内容长度上有些不符合预期,导致越界使处理条件出错,所以可以考虑使用以下方法来实现文本控制条件:
1.首先需要注册通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onTextViewEditChanged:) name:@"UITextViewTextDidChangeNotification" object:nil];
2.实现监听方法:
// 监听字符变化,并处理
- (void)onTextViewEditChanged:(NSNotification *)obj
{
UITextView *textView = (UITextView *)obj.object;
self.placeholderLab.hidden = textView.hasText;
if (ReportTextViewMaxLength > 0)
{
NSString *toBeString = textView.text;
//获取当前高亮
UITextRange *selectedRange = [textView markedTextRange];
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 如果没有高亮选择,则对已经输入的文字进行字数统计、限制
if (!position)
{
if (toBeString.length > ReportTextViewMaxLength)
{
[textView shake];
[MBProgressHUD show:@"举报内容最多为60字!" icon:nil view:[UIApplication sharedApplication].keyWindow hideAfterDelay:1.0];
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:ReportTextViewMaxLength];
if (rangeIndex.length == 1)
{
textView.text = [toBeString substringToIndex:ReportTextViewMaxLength];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, ReportTextViewMaxLength)];
textView.text = [toBeString substringWithRange:rangeRange];
}
}
}
}
//这里可以实现其他需要的处理。
}
}
3.最后不要忘了在页面销毁的时候移除通知:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextViewTextDidChangeNotification" object:nil];