2009-06-18 31 views
11

我的應用程序中有一個UITextField。我想限制可以輸入字段的字符集到我定義的集合。我可以過濾進入該領域的字符文本時使用UITextFieldDelegate方法承諾:過濾字符輸入到UITextField

- (BOOL)textFieldShouldReturn:(UITextField*)textField 

然而,這爲用戶提供了一個虛假的印象,雖然限制字符從最終值被刪除,他們仍然明顯在按下Return/Done /等之前進入文本字段。在鍵盤上選擇文本字段時,防止出現限制字符的最佳方法是什麼?

注:我正在假設我無法控制iPhone鍵盤提供哪些按鍵。我知道我可以在不同的鍵盤實現之間切換,但是我覺得我不能禁用特定的鍵。這個假設可能不正確。

回答

13

textField:shouldChangeCharactersInRange

此方法由UITextFieldDelegate每當新的字符輸入或現有的字符從文本字段刪除調用。您可以返回NO以不允許更改。

+2

此答案的示例代碼可以在這裏找到:http://stackoverflow.com/questions/1013647/filtering-characters-entered-into-a-uitextfield/1015262#1015262 – teabot 2009-06-18 21:28:56

+2

很好的工作添加到您的答案的URL是正好在這個之下。 +1 – uerceg 2013-12-11 12:11:57

2

UITextViewDelegate方法- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

這正是你所需要的。

-6

一旦DidBeginEditing方法被調用,您可以循環並繼續檢查UITextField.text屬性是否已更改。如果有,請檢查文本並刪除不良字符。

+1

這會耗盡太多資源。 – evilgoldfish 2012-03-11 07:01:54

25

我做了marcc建議,它運作良好。示例實現如下。

注:選擇變量名稱爲簡潔起見,並不反映我的編碼標準:

... 
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"]; 
    ... 
} 

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered { 
    for (int i = 0; i < [textEntered length]; i++) { 
     unichar c = [textEntered characterAtIndex:i]; 
     if (![myCharSet characterIsMember:c]) { 
      return NO; 
     } 
    } 
    return YES; 
} 
+1

無需遍歷textEntered中的所有字符。你可以檢查unichar c = [textEntered characterAtIndex:[textEntered length] - 1];你不需要for循環 – 2011-07-18 18:13:12

3

這裏是最乾淨的方法來限制在爲UITextField輸入的字符中的一個。這種方法允許使用多個預定義的NSCharacterSets。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; 
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]]; 

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){ 

     return YES; 

    } 

    return NO; 

} 
1

這是我用來將用戶限制爲大寫字母A-Z。根據口味調整正則表達式變量:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString* regex = @"[^A-Z]"; 
    return ([string rangeOfString: regex 
         options:NSRegularExpressionSearch].location == NSNotFound); 
}; 
0

這個怎麼樣?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString* regex = @"[^a-z]"; 
    return ([[string lowercaseString] rangeOfString: regex 
         options:NSRegularExpressionSearch].location == NSNotFound); 
}; 

注:

我提出的所有字符爲小寫[string lowercaseString],這樣就不需要在正則表達式captial /小寫字母來寫。