1. 程式人生 > >iOS限制UITextField的輸入字元數

iOS限制UITextField的輸入字元數

本文為原創,未經允許勿轉載

專案中經常會遇到限制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]; } }

另外,可利用UIRespondertextInputMode屬性獲取當前鍵盤所使用的輸入模式,例如使用中文輸入法時,在上述checkTextFieldTextLength:訊息中插入:

NSLog(@"textField.textInputMode: %@", [textField.textInputMode primaryLanguage]);

會打印出:

textField.textInputMode: zh-Hans

意味著此時使用者正使用中文輸入法.

參考:

如果覺得本文對你有幫助,就請用微信打賞我吧^_^

請葉秋喝杯咖啡吧