UITextView如何限制限制文本輸入長(zhǎng)度
1. 開(kāi)發(fā)中,經(jīng)常遇到要限制字符串輸入長(zhǎng)度的需求,你首先想到的可能會(huì)用這個(gè)代理方法限制長(zhǎng)度
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
結(jié)果發(fā)現(xiàn)并不能完美限制用戶輸入,原因是用戶選中鍵盤頂部條的聯(lián)想文字時(shí)不會(huì)調(diào)用這個(gè)代理方法 , 所以要尋找其他方法,下面提供一種比較全面完美的解決方案
2. 完美解決方案 -- 監(jiān)聽(tīng)文本輸入,超出指定長(zhǎng)度時(shí),截取子串
- 第一步: textView的文本改變時(shí),會(huì)發(fā)出通知,我們需要監(jiān)聽(tīng)這個(gè)通知
/**
* 監(jiān)聽(tīng)textView的文本改變
*/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChangeText:) name:UITextViewTextDidChangeNotification object:textView];
- 第二步: 實(shí)現(xiàn)textViewDidChangeText方法,具體限制用戶輸入
- 中文輸入的時(shí)候,需要判斷有沒(méi)有markedText(簡(jiǎn)體拼音輸入的時(shí)候,輸入的拼音還沒(méi)有選擇對(duì)應(yīng)的漢字時(shí),輸入框中的輸入的拼音是選中的高亮狀態(tài),這串拼音就是markedText),對(duì)這種狀態(tài)要做特殊處理,因?yàn)檫@個(gè)拼音字符串還沒(méi)有轉(zhuǎn)換成漢字字符串,不需要做處理,當(dāng)用戶選擇了拼音對(duì)應(yīng)的漢字時(shí),就需要判斷輸入框的文字進(jìn)行處理了,具體代碼如下 :

Paste_Image.png
/**
* 監(jiān)測(cè)用戶輸入文本長(zhǎng)度
*/
- (void)textViewDidChangeText:(NSNotification *)notification
{
/**
* 最大輸入長(zhǎng)度,中英文字符都按一個(gè)字符計(jì)算
*/
static int kMaxLength = 10;
UITextView *textView = (UITextView *)notification.object;
NSString *toBeString = textView.text;
// 獲取鍵盤輸入模式
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];
// 中文輸入的時(shí)候,可能有markedText(高亮選擇的文字),需要判斷這種狀態(tài)
// zh-Hans表示簡(jiǎn)體中文輸入, 包括簡(jiǎn)體拼音,健體五筆,簡(jiǎn)體手寫
if ([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textView markedTextRange];
//獲取高亮選擇部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 沒(méi)有高亮選擇的字,表明輸入結(jié)束,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制
if (!position) {
if (toBeString.length > kMaxLength) {
// 截取子串
textView.text = [toBeString substringToIndex:kMaxLength];
}
} else { // 有高亮選擇的字符串,則暫不對(duì)文字進(jìn)行統(tǒng)計(jì)和限制
NSLog(@"11111111111111======== %@",position);
}
} else {
// 中文輸入法以外的直接對(duì)其統(tǒng)計(jì)限制即可,不考慮其他語(yǔ)種情況
if (toBeString.length > kMaxLength) {
// 截取子串
textView.text = [toBeString substringToIndex:kMaxLength];
}
}
}
- 第三步 : 在dealloc中移除通知監(jiān)聽(tīng)
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- iOS技術(shù)開(kāi)發(fā)交流QQ群: 579572313