代码之家  ›  专栏  ›  技术社区  ›  teabot

筛选输入到uitextfield中的字符

  •  12
  • teabot  · 技术社区  · 17 年前

    我的应用程序中有一个uitextfield。我想将可以输入字段的字符集限制为我定义的一组。使用uitextfieldDelegate方法提交文本时,我可以筛选输入到字段中的字符:

    - (BOOL)textFieldShouldReturn:(UITextField*)textField
    

    但是,这给用户一个错误的印象,尽管限制字符从最终值中删除,但在按回车/完成等键之前,它们仍然明显地输入到文本字段中。在键盘上选择限制字符时,防止限制字符出现在文本字段中的最佳方法是什么?

    注: 我的操作假设是,我对iPhone键盘提供的按键几乎没有控制权。我知道我可以在不同的键盘实现之间切换,但是我觉得我不能禁用特定的键。这种假设可能不正确。

    7 回复  |  直到 11 年前
        1
  •  14
  •   marcc    17 年前

    textField:shouldChangeCharactersInRange

    此方法由 UITextFieldDelegate 每当键入新字符或从文本字段中删除现有字符时。您可以返回“否”以不允许更改。

        2
  •  25
  •   teabot    17 年前

    我按照马尔科的建议做了,效果很好。下面是示例实现。

    注: 变量名的选择是为了简洁,不反映我的编码标准:

        ...
        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;
    }
    
        3
  •  3
  •   Brody Robertson    13 年前

    这里是限制在uitextfield中输入字符的最干净的方法之一。这种方法允许使用多个预定义的nscharacter。

    -(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;
    
    }
    
        4
  •  2
  •   BJ Homer    17 年前

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

    这正是你需要的。

        5
  •  1
  •   Matt Parkins    11 年前

    这是我用来将用户限制为大写的a-z。根据口味调整regex变量:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
        NSString* regex = @"[^A-Z]";
        return ([string rangeOfString: regex
                          options:NSRegularExpressionSearch].location == NSNotFound);
    };
    
        6
  •  0
  •   Fahim Parkar    11 年前

    这个怎么样?

    - (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] 所以你不需要用regex来写大写/小写字母。

        7
  •  -6
  •   Dan Lorenc    17 年前

    调用didbeginediting方法后,可以循环并继续检查uitextfield.text属性是否已更改。如果有,请检查文本并删除坏字符。