textField字符長度限制的方法

在項目開發(fā)過程中,遇到這么一個需求,編輯標簽時,輸入的最大長度需要限制為24個字節(jié)。

查閱了一些材料,并參考了之前項目的相關處理辦法,今天在這里總結一下解決方案。

1.添加對UITextField的編輯變化事件的監(jiān)聽:

[self.textField addTarget:self action:@selector(textLengthChange:) forControlEvents:UIControlEventEditingChanged];

2.實現對應的action:

-(void)textLengthChange:(id)sender

{

    UITextField * textField=(UITextField*)sender;

    NSString * temp = textField.text;

    

    if (textField.markedTextRange ==nil)

    {

        while(1)

        {

            if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding]<= kMaxByteOfAlarmName)
            {

                break;

            }

            else

            {

                temp = [temp substringToIndex:temp.length-1];

            }

        }

        textField.text=temp;

    }

}

說明:如果內容超長,就干掉最后一個字,再判斷是否超過限制長度,如此循環(huán),直到滿足長度限制要求。這里注意一下,直接使用length方法返回的是字符數,而不是字節(jié)數,lengthOfBytesUsingEncoding 可返回指定字符編碼的字節(jié)數。

另外,中文輸入時,和平時英文輸入會不太一樣,中文輸入會出現正在輸入拼音,還沒有選漢字,拼音已經上去了:

屏幕截圖

這時,拼音本身占的字節(jié)可能大于選字后的漢字所占的字節(jié),例如輸入zhong,占5個字節(jié),而如果用戶選擇“中”,只占三個字節(jié)。如果不專門考慮這種情況,就會出現明明還可以再輸一個中文漢字,但是輸入拼音的時候沒法完成zhong的拼音輸入。所以需要判斷當時textField是否有已選中的內容。
?
3.針對步驟2中的圖,如果在出現圖中的狀態(tài)下直接保存,那么textfiled會把未轉換為漢字的拼音也一起保存進去。所以還需要在使用textfield的內容前再進行一下處理,把超出的部分刪除:

-(void)repairTextField
{
    NSString * temp = self.textField.text;
    while(1)
    {
        if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= kMaxByteOfAlarmName) {
            break;
        }
        else
        {
            temp = [temp substringToIndex:temp.length-1];
        }
    }
    self.textField.text=temp;
}
?```
Done。如果有什么問題,歡迎留言指出,一起討論。
 
補充點東西:
?
為什么不用UITextField的代理方法shouldChangeCharactersInRange?
目前看來,此方法無法捕捉粘貼、拼音轉漢字和聯想(例如使用拼音輸“中國”后,直接再鍵盤的候選詞中可以選“萬歲”)輸入導致的變化。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容