1. 程式人生 > >iOS UITextView 限制字數(解決了截斷輸入聯想和對系統鍵盤中文不友好的問題)

iOS UITextView 限制字數(解決了截斷輸入聯想和對系統鍵盤中文不友好的問題)

原貼出處:http://blog.csdn.net/z794614061/article/details/53821798

個人認為是目前最好的截斷方式!

解決的問題有:
1.截斷漢字對中文輸入不友好的問題(比如要輸入最後一個漢字“講”,輸入字母j之後就不讓你輸入了。注:在系統自帶鍵盤中文會出現這個問題)
2.我已經輸入滿了,此時游標放在文字中間,再輸入就會頂掉後面的字。需求當然是刪掉你正在輸入的字,已完美解決。


需求 輸入框限制字數
需求下來 想參考一些資源 結果 覺得都不太能滿足咱產品這需求 只能自己寫了
想了想 需求清晰 思路也就清晰了
以下是程式碼

UITextRange *selectedRange = [textView markedTextRange];
    //獲取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0]; NSRange selection = textView.selectedRange; NSInteger realLength = textView.text.length; //實際總長度 NSString *headText = [textView.text substringToIndex:selection.location]; //游標前的文字 NSString *tailText = [textView.text
substringFromIndex:selection.location];//游標後的文字 NSInteger restLength = self.maxLength - tailText.length; //游標後允許輸入的文字長度 if (realLength > self.maxLength) { NSString *subHeadText = [headText substringToIndex:restLength]; textView.text = [subHeadText stringByAppendingString:tailText]; [textView setSelectedRange:NSMakeRange(restLength, 0
)]; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

執行以上程式碼嘗試一下 是不是覺得有問題??? 當你輸中文的時候 甚至不能拼完對不對
問題是什麼? 問題是字數限制問題出現了 那麼解決問題就顯得目標明確得多了
同事高見 顯而易見的是當輸入中文的時候拼音處於高亮狀態
那麼 高亮字元不加入字數限制就可以解決問題了 其實這麼個判斷

    //如果在變化中是高亮部分在變,就不要計算字元了
    if (selectedRange && pos) {
        return;
    }
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

於是 改善後 程式碼段如下

- (void)textViewDidChange:(UITextView *)textView{

    UITextRange *selectedRange = [textView markedTextRange];
    //獲取高亮部分
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];

    //如果在變化中是高亮部分在變,就不要計算字元了
    if (selectedRange && pos) {
        return;
    }
    NSRange selection = textView.selectedRange;

    NSInteger realLength = textView.text.length; //實際總長度

    NSString *headText = [textView.text substringToIndex:selection.location]; //游標前的文字
    NSString *tailText = [textView.text substringFromIndex:selection.location];//游標後的文字

    NSInteger restLength = self.maxLength - tailText.length; //游標後允許輸入的文字長度

    if (realLength > self.maxLength) {
        NSString *subHeadText = [headText substringToIndex:restLength];
        textView.text = [subHeadText stringByAppendingString:tailText];
        [textView setSelectedRange:NSMakeRange(restLength, 0)];
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

歡迎拍磚。。。��