13

我的应用程序中有一个 UITextField。我想将可以输入到字段中的字符集限制为我定义的字符集。当使用 UITextFieldDelegate 方法提交文本时,我可以过滤输入到字段中的字符:

- (BOOL)textFieldShouldReturn:(UITextField*)textField

但是,这会给用户一种错误的印象,因为尽管限制字符已从最终值中删除,但在按下 Return/Done/etc 之前,它们仍然可见地输入到文本字段中。防止在键盘上选择受限字符时出现在文本字段中的最佳方法是什么?

注意:我在假设我几乎无法控制 iPhone 键盘提供哪些键的情况下进行操作。我知道我可以在各种键盘实现之间切换,但我的印象是我无法禁用特定键。这个假设可能是不正确的。

4

7 回答 7

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;
}
于 2009-06-18T21:25:06.373 回答
15

看着textField:shouldChangeCharactersInRange

UITextFieldDelegate每当键入新字符或从文本字段中删除现有字符时,都会调用此方法。您可以返回 NO 以不允许更改。

于 2009-06-18T16:50:09.550 回答
4

这是限制在 UITextField 中输入的字符的最简洁的方法之一。这种方法允许使用多个预定义的 NSCharacterSet。

-(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;

}
于 2013-07-25T14:03:53.683 回答
2

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

这正是您所需要的。

于 2009-06-18T16:51:13.963 回答
2

这就是我用来将用户限制为大写 AZ 的方法。根据口味调整正则表达式变量:

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

    NSString* regex = @"[^A-Z]";
    return ([string rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};
于 2014-09-23T16:03:45.073 回答
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],这样您就不需要用正则表达式来写大写/小写字母。

于 2015-04-06T05:43:37.273 回答
-6

一旦调用了 DidBeginEditing 方法,您可以循环并继续检查 UITextField.text 属性是否已更改。如果有,请检查文本并删除错误字符。

于 2009-06-18T16:51:18.583 回答