如何讓 UITextField 輸入的文字為英文數字限定,而且自動轉換成大寫英文字母?

UITextField 是開發 XCode 用來開發程式的一個重要元件,也是讓使用者自由輸入文字的元件。UITextField 相對於 Android 系統來說,就是 EditText。而如果我們要設計一個欄位,如身份證字號,只能讓使用者自動輸入英文或數字,在 Android 來說,只要從 XML 中設定就可以了,但在 XCode 中,我們則必須寫在程式碼中。寫法其實並不難,有分好幾種方式,而海芋個人是比較喜歡用正規表達式來限定,所以以下的方式,就以正規表達式來做一個示範。

假設,我們有一個 UITextField,已命名為 m_TextField_ID,如果要判斷讓使用者在該 UITextField 只能輸入英數的話,那麼只要寫以下的函式。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.m_TextField_ID)
    {
        NSString* resultString = [textField.text stringByReplacingCharactersInRange: range
                                                                         withString: string];
        NSString *regExPattern = @"[a-zA-Z0-9]*";
        BOOL bIsInputValid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", regExPattern] evaluateWithObject: resultString];
        return bIsInputValid;
    }
    return YES;
}

這一段程式碼很簡單,首先我們先定義一個新的字串,叫做 resultString,resultString 是使用者輸入後的字串,會隨使用者輸入而即時改變,接下來在用正規表達式,檢查使用者是否輸入英數模式,如果是的話就回傳 YES,如果不是的話就回傳 NO。至於 NSPredicate,則是可以參考 「APPLE 官方網站」的介紹。

如果我只是即時把使用者輸入的英文字元都變大寫,怎麼做呢?也是很簡單,請參考下列程式碼。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.m_TextField_ID)
    {
        NSString* resultString = [textField.text stringByReplacingCharactersInRange: range
                                                                         withString: string];
        [textField setText:[resultString uppercaseString]];
        return NO;
    }
    return YES;
}

上面程式碼是說,我們先定義一個新的字串,叫做 resultString,resultString 是使用者輸入後的字串,接下來,我們將目前這個 TextField 所顯示的字串設為 [resultString uppercaseString],也就是將使用者輸入後的字串設到 TextField 去,因為已經將新產生的字串設到 TextField 了,所以這時就不用再通知 iOS 要再改變 TextField 的字串了,所以直接回傳 NO 就可以了。

而這兩個範例如果要加起來怎麼做呢?以下就是一個 TextField 只能輸入英數,而且即時將英文字母自動變為大寫的範例,供大家參考囉!

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.m_TextField_ID)
    {
        NSString* resultString = [textField.text stringByReplacingCharactersInRange: range
                                                                         withString: string];
        NSString *regExPattern = @"[a-zA-Z0-9]*";
        BOOL bIsInputValid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", regExPattern] evaluateWithObject: resultString];
        if (bIsInputValid)
        {
            [textField setText:[resultString uppercaseString]];
             return NO;
        }
        return bIsInputValid;
    }
    return YES;
}
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments