限制 UITextField 的字符数量和类型

12

我有两个文本字段,希望限制字符的数量和类型。我分别使用以下代码来实现每个功能,但是找不到一种同时实现两个功能的方法。

要限制字符类型:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // Only characters in the NSCharacterSet you choose will insertable.
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];
}

并且限制字符数量:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 if (textField.text.length >= 10 && range.length == 0)
 return NO;
return YES;
}
3个回答

20
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.text.length >= 10 && range.length == 0)
       return NO;
    // Only characters in the NSCharacterSet you choose will insertable.
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];
}

经过编辑

如果您想为第三个文本字段添加不同的条件,则可以按照以下方式操作。
创建第三个文本字段的引用,例如 thirdField

然后使用以下代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == thirdField) {
        //your contion e.g
        if (textField.text.length < 7) {
            return YES;
        } else {
            return NO;
        }        
    }
    else {
        if (textField.text.length >= 10 && range.length == 0)
            return NO;
        // Only characters in the NSCharacterSet you choose will insertable.
        NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet];
        NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
        return [string isEqualToString:filtered];
    }
}

如果我添加了第三个文本字段,但想要对其应用不同的条件,我该怎么做? - Tool

3
这是一种非常干净的方法,可以限制在UITextField中输入的字符。此方法允许使用多个预定义的NSCharacterSet。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];
    [allowedCharacters addCharactersInString:@":./"];  //allow arbitrary characters

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

        return YES;

    }

    return NO;

}

2
这是方法:
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        // Only characters in the NSCharacterSet you choose will insertable.
        NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefgABCDEFG"] invertedSet];
        NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
        bool cond1 = [string isEqualToString:filtered];

     if (textField.text.length >= 10 && range.length == 0){
          return NO;
     }else{
          return (cond1);
     }

    }

我很快地写了这个,但是想法是要检查这两个条件是否都符合。 - Resh32
如果 (cond1) 返回 YES; 否则返回 NO - 为什么不直接使用 return (cond1) 呢?这总是让我感到困惑。 - Cyrille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接