【问题标题】:UITextfield limit with no special charecters ios objective c没有特殊字符的UITextfield限制ios目标c
【发布时间】:2018-07-13 03:56:59
【问题描述】:

我有一个UITextField,其中不允许使用特殊字符以及最多 20 个章程长度。

我正在使用以下代码来限制文本字段

NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > limitPassportNumber) ? NO : YES;

为了停止特殊字符输入,我有以下代码。

NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];
        NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
        return [string isEqualToString:filtered];

现在如果我需要同时返回两个,那么只会执行一个。

有人可以请教。谢谢

【问题讨论】:

    标签: ios objective-c uitextfield


    【解决方案1】:

    检查长度。如果太长,请返回NO。否则检查字符是否有效。

    您检查有效字符的代码效率很低。拆分和重新加入整个字符串并不是检查它是否包含任何无效字符的好方法。

    以下代码是处理您的案例的更好方法:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        NSUInteger newLength = textField.text.length + string.length - range.length;
        if (newLength > limitPassportNumber) {
            return NO; // too long
        }
    
        NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];
        NSRange badRange = [string rangeOfCharacterFromSet:cs];
    
        return badRange.location == NSNotFound;
    }
    

    【讨论】:

      【解决方案2】:
      -(BOOL)isValidString:(NSString *)string{
          NSString *regex = @"[A-Z0-9a-z]*";
          NSPredicate *regTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
          if ([regTest evaluateWithObject:string]) {
              return YES;
          }
          return NO;
      }
      
      -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
          if ([string length] == 0)
              return YES;
          if ([string length] > 0 && [string length] <=20) {
              NSString *newString = [textField text];
              newString = [newString stringByReplacingCharactersInRange:range withString:string];
      
              return [self isValidString:newString];
          } else {
              return NO;
          }
      }
      

      【讨论】:

      • Objective-C BOOLYESNO。在根据正则表达式验证文本之前检查长度会更有效。如果字符串太长,评估昂贵的谓词是没有意义的。
      • @rmaddy,更新了答案。谢谢你让我正确。真的很感激。
      【解决方案3】:
      NSString *str = @"[~!@#$%^&*()_+-]";
      
      NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", str];
      
      if([[str evaluateWithObject:textfield.text]== YES] && [textfield.text length]<20){
      
        // Do Something
      }
      else{
      
        //Textfield has a special character or the text is greater than 20
      }
      

      【讨论】:

      • 这是检查错误的长度。 emailTest 从未使用过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2018-10-11
      • 2013-01-11
      相关资源
      最近更新 更多