2009-06-18 30 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 /小写字母来写。