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