iOS限制UITextField的輸入字元數
阿新 • • 發佈:2019-01-25
本文為原創,未經允許勿轉載
專案中經常會遇到限制UITextField中輸入字元數的需求,並且會根據輸入的英文還是中文給出不同的限定數,本文記錄其解決方案。
對於全英文的輸入限定很簡單,但是輸入中文時,當輸入拼音但未選擇中文時,此時輸入文字框的文字會包括輸入的拼音,是選中的狀態,比如這樣:
上面的情況如果列印UITextField的text屬性會輸出:中國di zhi
。由於拼音是選中狀態的,那麼可以根據 UITextInput 協議判斷UITextField中是否有選中狀態的字元,從而決定是否對輸入字元進行截斷處理。
當UITextField中輸入文字發生變化時,會發送 UITextFieldTextDidChangeNotification
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkTextFieldTextLength:) name:UITextFieldTextDidChangeNotification object:nil];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self ];
}
然後在checkTextFieldTextLength:
訊息中處理輸入限定:
- (void)checkTextFieldTextLength:(NSNotification *)noti{
UITextField *textField = noti.object;
NSString *text = textField.text;
NSLog(@"text: %@", text);
//記錄待選文字記錄
UITextRange *markedTextRange = textField.markedTextRange;
//如果存在待選文字記錄,則暫不處理
if (markedTextRange) {
return;
}
//獲取文字的位元組長度
NSUInteger lenOfBytes = [text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
if (text.length == lenOfBytes && text.length > kMaxEnglishLen) { //全英文字元
textField.text = [text substringToIndex:kMaxEnglishLen];
} else if (text.length != lenOfBytes && text.length > kMaxChineseLen) { //包含非英文字元
textField.text = [text substringToIndex:kMaxChineseLen];
}
}
另外,可利用UIResponder
的textInputMode
屬性獲取當前鍵盤所使用的輸入模式,例如使用中文輸入法時,在上述checkTextFieldTextLength:
訊息中插入:
NSLog(@"textField.textInputMode: %@", [textField.textInputMode primaryLanguage]);
會打印出:
textField.textInputMode: zh-Hans
意味著此時使用者正使用中文輸入法.
參考:
如果覺得本文對你有幫助,就請用微信打賞我吧^_^