在項目開發過程中,遇到這么一個需求,編輯標簽時,輸入的最大長度需要限制為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?
目前看來,此方法無法捕捉粘貼、拼音轉漢字和聯想(例如使用拼音輸“中國”后,直接再鍵盤的候選詞中可以選“萬歲”)輸入導致的變化。