【问题标题】:How can I restrict special characters in UITextField except dot and underscores?如何限制 UITextField 中的特殊字符(点和下划线除外)?
【发布时间】:2013-01-11 13:10:25
【问题描述】:

如何限制UITextField 中除点和下划线之外的特殊字符?

我试过下面的代码sn-p,但没有运气:

#define ACCEPTABLE_CHARECTERS @" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_."

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
         NSCharacterSet *acceptedInput = [NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARECTERS];
        if (![[string componentsSeparatedByCharactersInSet:acceptedInput] count] > 1){
            NSLog(@"not allowed");
            return NO;
        }
        else{
            return YES;
        }
}

【问题讨论】:

标签: ios objective-c uitextfield


【解决方案1】:

试试下面给出的代码块,它对我来说很好。

SWIFT 3.0

let ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let cs = NSCharacterSet(charactersIn: ACCEPTABLE_CHARACTERS).inverted
    let filtered = string.components(separatedBy: cs).joined(separator: "")

    return (string == filtered)
}

目标 C

#define ACCEPTABLE_CHARACTERS @" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_."

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string  {
      NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];

      NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

      return [string isEqualToString:filtered];
}

希望它也对你有用。

【讨论】:

  • 应该是return ![string isEqualToString:filtered];
  • @Fogh 他已经在使用invertedSet 方法,所以我们不需要在返回语句中包含!
  • 谢谢。它工作正常。
  • 拆分某些东西似乎有点过分,将其重新组合在一起,然后查看两者是否匹配,而您真正需要做的就是计算拆分后有多少组件。如果有多个,您已经知道有不需要的字符。
  • 这里是 Swift 版本,让 ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789_."; func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let set = CharacterSet(charactersIn: ALLOWED_CHARS); let filters = string .components(separatedBy: set) .joined(separator: "");返回过滤!=字符串; }
【解决方案2】:

试试这个

NSCharacterSet  *set= [NSCharacterSet symbolCharacterSet];
if ([string rangeOfCharacterFromSet:[set invertedSet]].location == NSNotFound) {
    // valid
} else {
    // invalid
}

您可以使用

制作自己的套装
NSCharacterSet  *set= [NSCharacterSet characterSetWithCharactersInString:@"<all your symbols you want to ignore>"];

【讨论】:

  • symbolCharacterSet 更改为ACCEPTABLE_CHARECTERS,这将按他的意愿工作....
【解决方案3】:

斯威夫特 4

let RISTRICTED_CHARACTERS = "'*=+[]\\|;:'\",<>/?%"

UITextField 委托方法:

func textField(_ textField: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool {
    let set = CharacterSet(charactersIn: RISTRICTED_CHARACTERS)
    let inverted = set.inverted
    let filtered = string.components(separatedBy: inverted).joined(separator: "")
    return filtered != string
}

【讨论】:

  • 这有一个错误,返回 bool 应该是 == 而不是 !=。目前它将允许除受限字符之外的所有字符。
  • 这对 case string == "" 不起作用(例如清除输入)
【解决方案4】:

NSString *Regex = @"[A-Za-z0-9^]*";

NSPredicate *TestResult = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", Regex];

[TestResult evaluateWithObject:@"YourTestString"];

最后返回布尔值真/假

在方法中

+ (BOOL) validateSpecialCharactor: (NSString *) text {
NSString *Regex = @"[A-Za-z0-9^]*";
NSPredicate *TestResult = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", Regex];
return [TestResult evaluateWithObject:text];
}

【讨论】:

    【解决方案5】:

    Swift 2.2 基于Mrunal's answer:

    let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
    func textField(
        textField: UITextField,
        shouldChangeCharactersInRange range: NSRange,
        replacementString string: String)
        -> Bool
    {
        let set = NSCharacterSet(charactersInString: notAllowedCharacters);
        let inverted = set.invertedSet;
    
        let filtered = string
            .componentsSeparatedByCharactersInSet(inverted)
            .joinWithSeparator("");
        return filtered == string;
    
    }
    

    【讨论】:

    • 我可以添加'if string == "" {return true}'吗?
    • @a.u.b 我不认为替换字符串可以为空,但试一试
    【解决方案6】:

    Swift 3.1 解决方案


    let ACCEPTABLE_CHARACTERS = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_."
        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            let cs = CharacterSet(charactersIn: ACCEPTABLE_CHARACTERS).inverted
            let filtered: String = (string.components(separatedBy: cs) as NSArray).componentsJoined(by: "")
            return (string == filtered)
        }
    

    【讨论】:

      【解决方案7】:

      这可能会帮助你尝试这个......请告诉我

      -(BOOL)isHaveSpecialChar:(NSString*)str{
      NSString *customStr = @"~`!@#$%^&*()+=-/;:\"\'{}[]<>^?, ";
      NSCharacterSet *alphaSet = [NSCharacterSet characterSetWithCharactersInString:customStr];
      BOOL isHaveSpecialChar = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];
      return !isHaveSpecialChar;
      }
      

      【讨论】:

      • 这是错误的 - 如果str 中的每个字符都是customStr 中的字符,它只会返回YES
      【解决方案8】:
      func  textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
      
          let set = NSCharacterSet(charactersIn: "0123456789")
          let inverted = set.inverted;
      
          let filtered = string.components(separatedBy: inverted).joined(separator: "")
          return filtered == string;
      

      【讨论】:

        【解决方案9】:
        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            let cs = NSCharacterSet.decimalDigits.inverted
            let filtered = string.components(separatedBy: cs).joined(separator: "")
            return (string == filtered)
        }
        

        【讨论】:

          【解决方案10】:

          试试这个:

          NSString *str = @"___asdf.SHiv._.l.asg.  g.g._ASdgASG_.......asfgads.g.   .._____fdgdsfghsdfgh";
          
              str= [str stringByReplacingOccurrencesOfString:@"." withString:@""];
              str=[str stringByReplacingOccurrencesOfString:@"_" withString:@""];
              str=[str stringByReplacingOccurrencesOfString:@" " withString:@""];
              str=[str stringByTrimmingCharactersInSet:[NSCharacterSet alphanumericCharacterSet]];
          
              if ([str isEqualToString:@""]) {
                  NSLog(@"valid");
              }
              else {
                  NSLog(@"invalid");
              }
          

          【讨论】:

          • 这是一个非常环形的交叉路口。正则表达式正是为这种事情而构建的。
          猜你喜欢
          • 2014-10-11
          • 2014-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2015-01-24
          相关资源
          最近更新 更多