UITextView如何限制限制文本輸入長度
1. 開發(fā)中,經(jīng)常遇到要限制字符串輸入長度的需求,你首先想到的可能會用這個代理方法限制長度
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
結果發(fā)現(xiàn)并不能完美限制用戶輸入,原因是用戶選中鍵盤頂部條的聯(lián)想文字時不會調用這個代理方法 , 所以要尋找其他方法,下面提供一種比較全面完美的解決方案
2. 完美解決方案 -- 監(jiān)聽文本輸入,超出指定長度時,截取子串
- 第一步: textView的文本改變時,會發(fā)出通知,我們需要監(jiān)聽這個通知
/**
* 監(jiān)聽textView的文本改變
*/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChangeText:) name:UITextViewTextDidChangeNotification object:textView];
- 第二步: 實現(xiàn)textViewDidChangeText方法,具體限制用戶輸入
- 中文輸入的時候,需要判斷有沒有markedText(簡體拼音輸入的時候,輸入的拼音還沒有選擇對應的漢字時,輸入框中的輸入的拼音是選中的高亮狀態(tài),這串拼音就是markedText),對這種狀態(tài)要做特殊處理,因為這個拼音字符串還沒有轉換成漢字字符串,不需要做處理,當用戶選擇了拼音對應的漢字時,就需要判斷輸入框的文字進行處理了,具體代碼如下 :
/**
* 監(jiān)測用戶輸入文本長度
*/
- (void)textViewDidChangeText:(NSNotification *)notification
{
/**
* 最大輸入長度,中英文字符都按一個字符計算
*/
static int kMaxLength = 10;
UITextView *textView = (UITextView *)notification.object;
NSString *toBeString = textView.text;
// 獲取鍵盤輸入模式
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];
// 中文輸入的時候,可能有markedText(高亮選擇的文字),需要判斷這種狀態(tài)
// zh-Hans表示簡體中文輸入, 包括簡體拼音砂轻,健體五筆勤众,簡體手寫
if ([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textView markedTextRange];
//獲取高亮選擇部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,表明輸入結束,則對已輸入的文字進行字數(shù)統(tǒng)計和限制
if (!position) {
if (toBeString.length > kMaxLength) {
// 截取子串
textView.text = [toBeString substringToIndex:kMaxLength];
}
} else { // 有高亮選擇的字符串藻懒,則暫不對文字進行統(tǒng)計和限制
NSLog(@"11111111111111======== %@",position);
}
} else {
// 中文輸入法以外的直接對其統(tǒng)計限制即可倍试,不考慮其他語種情況
if (toBeString.length > kMaxLength) {
// 截取子串
textView.text = [toBeString substringToIndex:kMaxLength];
}
}
}
- 第三步 : 在dealloc中移除通知監(jiān)聽
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- iOS技術開發(fā)交流QQ群: 579572313