iOS對textField進行字符長度限制的辦法


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

 

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

 

1.添加對UITextField的編輯變化事件的監聽:

 

[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;

    }

}

 

 

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

 

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

 



這時,拼音本身占的字節可能大於選字后的漢字所占的字節,例如輸入zhong,占5個字節,而如果用戶選擇“中”,只占三個字節。如果不專門考慮這種情況,就會出現明明還可以再輸一個中文漢字,但是輸入拼音的時候沒法完成zhong的拼音輸入。所以需要判斷當時textField是否有已選中的內容。

 

3.針對步驟2中的圖,如果在出現圖中的狀態下直接保存,那么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?

目前看來,此方法無法捕捉粘貼、拼音轉漢字和聯想(例如使用拼音輸“中國”后,直接再鍵盤的候選詞中可以選“萬歲”)輸入導致的變化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM