我的代碼我的坑(六) —— UITextField輸入長度自動截取時漢字和拼音帶來的末位截取不能正常輸入漢字的問題(一)

版本記錄

版本號 時間
V1.0 2019.02.23 星期六

前言

做了好幾個APP,碰到了大大小小的很多坑,以前碰到坑,解決了就結束了,這里想把自己碰到的坑記錄下來,一來給自己備查二來希望可以幫助到大家。感興趣的可以關注下,也歡迎大家補充留言,感興趣的看上面幾篇文章。
1. 我的代碼我的坑(一) —— 自簽名證書導致請求取消的問題(一)
2. 我的代碼我的坑(二) —— UIImageView動畫點擊后動畫和圖片消失的問題(一)
3. 我的代碼我的坑(三) —— iOS9系統(tǒng)WKWebView加載頁面白板的問題(一)
4. 我的代碼我的坑(四) —— iOS12系統(tǒng)自定義漸變色UISwitch手機橫屏的異常問題(一)
5. 我的代碼我的坑(五) —— 不可編輯狀態(tài)的UITextView文本高度大于視圖高度默認滾動到底部的問題(一)

問題描述

在很多的需求里面我們都要求UITextField輸入內容是限制長度的,還有的需求是超過一個定義的長度就截取固定長度,再輸入不能輸入的情況。關于截取這個我們都會就用字符串的subString方法進行截取就可以了。

這里有一個問題,就是假如限制輸入10個字,但是當你輸入8~9個字的時候,這個時候你將鍵盤調成漢語鍵盤,想輸入拼音打個漢字的時候,這個時候就會發(fā)現(xiàn)漢字打不出來不能正常輸入,反而將拼音計入長度計算,輸入框里末尾出現(xiàn)的就是拼音的一半了,這個體驗就很不好了,也就是說無法正常輸入最后一個或者兩個漢字了。

比如上面這個例子,需求是10個字限制,當我輸入9個字,然后打算再輸入一個"在"的時候,輸入拼音“zai”,就會發(fā)現(xiàn)輸入框自動截取了拼音的z作為最后一個允許輸入的字,不會允許輸入漢字了。


問題解決

1. 解決方案

這里不能用簡單的length或者subString進行長度截取了,在截取之前一定要判斷是不是漢字鍵盤,如果是的話要單獨處理,這樣就可以進行正常的最后一個或者兩個漢字的輸入了,如果不是漢字鍵盤就按正常的長度進行截取就可以了。

下面我們簡單看一下實現(xiàn)

2. 方案實現(xiàn)

這里就是直接看代碼了

//增加action
[self.inputTextField addTarget:self action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldValueChanged:(UITextField *)textField
{
    NSString *contentStr = textField.text;
    contentStr = [contentStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    if (contentStr.length > 0) { //按鈕的發(fā)送以及不可發(fā)送狀態(tài)切換
        [self.sendButton setTitleColor:[UIColor colorForHex:@"333333"] forState:UIControlStateNormal];
    }
    else {
        [self.sendButton setTitleColor:[UIColor colorForHex:@"999999"] forState:UIControlStateNormal];
    }
    
    [self cuttingTheNumber:contentStr length:10];
}

//輸入內容自動切除
- (void)cuttingTheNumber:(NSString *)content length:(NSInteger)maxLength 
{
    NSString *lang = [[self.inputTextField textInputMode] primaryLanguage];
    if([lang isEqualToString:@"zh-Hans"])
    {
        UITextRange *selectedRange = [self.inputTextField markedTextRange];
        UITextPosition *position = [self.inputTextField positionFromPosition:selectedRange.start offset:0];
        if(!position)
        {
            if(content.length > maxLength)
            {
                self.inputTextField.text = [content jjSubString:maxLength];
                [JJToastMgr showToast:@"不能超過10個字"];
            }
        }
    }
    else{
        if(content.length > maxLength)
        {
            self.inputTextField.text = [content jjSubString:maxLength];
            [JJToastMgr showToast:@"不能超過10個字"];
        }
    }
}

這里jjSubString是NSString的一個分類,就是切長度用的,具體實現(xiàn)如下所示:

//判斷字符串是否為空或者為空字符串
#define StringIsNullOrEmpty(str) (str==nil || [(str) isEqual:[NSNull null]] ||[str isEqualToString:@""])

- (NSString *)jjSubString:(NSInteger)endPos
{
    if (StringIsNullOrEmpty(self) || self.length<endPos) {
        return self;
    }
    NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:self.length-1];
    if (self.length-range.length > endPos) {
        range = [self rangeOfComposedCharacterSequenceAtIndex:endPos-1];
    }
    if (range.length > 1) {
        return [self substringToIndex:range.location];
    }
    else{
        return [self substringToIndex:endPos];
    }
}

這樣就實現(xiàn)了最后一個或者兩個漢字的正常輸入了。

后記

本篇主要講述了UITextField輸入長度自動截取時漢字和拼音帶來的末位截取不能正常輸入漢字的問題,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容