代碼前提
以下代碼實現的功能
- 限制輸入框輸入字數限制為60
- 一直保持鍵盤彈出的功能
#pragma mark - text view delegate
- (void)textViewDidChange:(UITextView *)textView
{
if ([textView.text length] > 60) {
textView.text = [textView.text substringWithRange:NSMakeRange(0, 60)];
[textView becomeFirstResponder];
return;
}
}
但是這樣會引起crash,類似于
*** Terminating app due to uncaught exception 'NSRangeException'
reason: '*** -[NSBigMutableString substringWithRange:]: Range {60, 1} out of bounds; string length 60'
分析原因
出現crash是因為,為了實現輸入的字數限制效果,會通過delegate監聽輸入框的UIControlEventEditingChanged事件,截取字符串,手動給輸入框的text屬性賦值。正常情況下輸入框自己默認執行setText:,默認不會注冊到自己的undoManager上,并且會清空undoManager的undo、redo棧,這樣并沒有問題。問題是在于監聽UIControlEventEditingChanged事件所執行的方法里是先程序代碼對輸入框的text做截取然后執行setText:,并沒有清空undoManager的undo、redo棧。
解決方案
#pragma mark - text view delegate
- (void)textViewDidChange:(UITextView *)textView
{
if ([textView.text length] > 60) {
textView.text = [textView.text substringWithRange:NSMakeRange(0, 60)];
[textView.undoManager removeAllActions];
[textView becomeFirstResponder];
return;
}
}
第二篇:
[iOS]iOS7系統下multistage text input(中文輸入法)下UITextView的內容長度限制