简体   繁体   English

快速对单个UITextField进行多次验证

[英]Multiple validations for a single UITextField in swift

I want multiple validation for VIN Number UITextField in Swift 我想在Swift中对VIN编号UITextField进行多次验证

  • It should be Capital letters only 只能是大写字母

  • It can contain 0-9 Numbers 它可以包含0-9个数字

  • No spaces and special characters allowed 不允许有空格特殊 字符

  • Total length must be 16 characters 总长度必须为16个字符

For Swift 3.0 对于Swift 3.0

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if string.characters.count == 0 {
        return true
    }

    let currentText = textField.text ?? ""
    let prospectiveText = (currentText as NSString).replacingCharacters(in: range, with: string)

    return prospectiveText.containsOnlyCharactersIn(matchCharacters: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") &&
        prospectiveText.characters.count <= 16
}

extension String {

    func containsOnlyCharactersIn(matchCharacters: String) -> Bool {

        let disallowedCharacterSet = NSCharacterSet(charactersIn: matchCharacters).inverted
        return self.rangeOfCharacter(from: disallowedCharacterSet) == nil
    }
}

The best solution is regular expression! 最好的解决方案是正则表达式! Simple as that [A-Z0-9]{16} . 就这么简单[A-Z0-9]{16}

NSString *testString=@"ABSDF9DFDSFPOIS1";
NSString *regExPattern = @"[A-Z0-9]{16}";

NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
NSUInteger regExMatches = [regEx numberOfMatchesInString:testString options:0 range:NSMakeRange(0, [testString length])];

if (regExMatches==0) {
//Not matched
}

Take a look here to see how this regex works and you will realise how flexible is to change. 在这里看看这个正则表达式是如何工作的,您将意识到更改的灵活性。

You can achieve all validation as following for Objective-C 您可以针对Objective-C进行以下所有验证

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if(textField==YOUR_USER_NAME_TEXTFIELD || textField == YOUR_PASSWORD_TEXTFIELD)
    {

        NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
        for (int i = 0; i < [string length]; i++)
        {
            unichar c = [string characterAtIndex:i];
            if (![myCharSet characterIsMember:c])
            {
                return NO;
            }
        }

        return YES;
    }

    return YES;
}

for Total length must be 16 characters 总长度必须为16个字符

You can count the length of yourtextfield. 您可以计算出textfield的长度。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM