没有特殊字符的UITextfield限制ios目标c

Posted

技术标签:

【中文标题】没有特殊字符的UITextfield限制ios目标c【英文标题】:UITextfield limit with no special charecters ios objective 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];

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

有人可以请教。谢谢

【问题讨论】:

【参考方案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 从未使用过。

以上是关于没有特殊字符的UITextfield限制ios目标c的主要内容,如果未能解决你的问题,请参考以下文章

无法将字符限制为 iOS 中 UITextField 内的字母数字 [重复]

允许在 UITextfield ios 中使用德语 UMLAUT 字符

iOS输入框UITextField输入限制

iOS中UITextField的验证[重复]

UITextField最大字符数和最大字节数的限制

iOS 限制UITextfield的字数