【问题标题】:Check textfield text while editing编辑时检查文本字段文本
【发布时间】:2020-02-15 21:04:49
【问题描述】:

我有一个textField,看起来像这样:

我想跟踪用户输入的内容。如果文本输入与文本字段下方的条件之一匹配,则“x”应更改为“checkImage”。

我已经有一个TextFieldDidChange 方法:

@objc func passwordTextFieldDidChange(_ textField: UITextField) {
        if textField.text == "" {
            self.eyeButton.isHidden = true
        }else {
            self.eyeButton.isHidden = false
        }

}

问题:

如何检查文本: 1. 至少 1 个大写字母 + 1 个小写字母 2. 至少 1 位数字 3. 长度至少为 8

事后我也用这种方法检查密码强度:

static func isPasswordValid(_ password : String) -> Bool {

    /*
    ^                         Start anchor
    (?=.*[A-Z].*[A-Z])        Ensure string has two uppercase letters.
    (?=.*[!@#$&*])            Ensure string has one special case letter.
    (?=.*[0-9].*[0-9])        Ensure string has two digits.
    (?=.*[a-z].*[a-z].*[a-z]) Ensure string has three lowercase letters.
    .{8}                      Ensure string is of length 8.
    $                         End anchor.
    */

    let passwordTest = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z]).(?=.*[0-9]).(?=.*[a-z]).{8,}$")
    return passwordTest.evaluate(with: password)
}

但用户也应该得到“实时”反馈,无论密码是否符合 3 个条件。

如果我的问题不清楚或者您需要更多信息,请告诉我。感谢每一个帮助:)

【问题讨论】:

    标签: ios swift regex uitextfield


    【解决方案1】:

    这是一个棘手的问题,但你在正确的轨道上。

    事后我也用这种方法检查密码强度

    不清楚您何时调用isPasswordValid(:),但这需要在文本字段更改后完成,最好是在passwordTextFieldDidChange(:) 函数中。

    奖励:您可以将眼睛按钮的更新移到一个单独的功能中以提高可读性。

    @objc func passwordTextFieldDidChange(_ textField: UITextField) {
        self.updateEyeButton(show: !textField.isEmpty)
        self.validate(password: textField.text)
    }
    

    有很多不同的方法可以完成这项任务,但这个应该是不言自明的,如果您需要进一步说明,请随时询问。

    您将需要单独验证您的每个要求。在您当前的isPasswordValid(:) 函数中,您将所有要求一起检查,这使得无法确定哪个通过/失败。

    您可以做的是创建一个单独的结构来验证需求,在本例中我们将其命名为PasswordValidator。此结构验证给定密码是否符合您的要求,如果不符合,则将缺少的要求返回给您。一旦你有一系列缺失的需求,你就可以对每一个采取行动(在你的情况下,改变每一个的图标)。

    类似这样的东西(未经测试):

    private struct PasswordValidator {
    
         private enum Result {
            case valid
            case invalid([Validator.Requirement])
         }
    
         private enum Requirement: String {
             case minimumOneUppercaseOneLowercase = "(?=.*[A-Z]).(?=.*[a-z])"
             case minimumOneDigit = "(?=.*[0-9])"
         }
    
          static func validate(password: String) -> PasswordValidator.Result {
    
              let missingRequirements = [Requirement]()
    
              if !evaluate(password: password, requirement: .minimumOneUppercaseOneLowercase) {
                  missingRequirements.append(.minimumOneUppercaseOneLowercase)
              }
    
              if !evaluate(password: password, requirement: .minimumOneDigit) {
                  missingRequirements.append(.minimumOneDigit)
              }
    
              if missingRequirements.isEmpty == false {
                  return .invalid(missingRequirements)
              }
    
              return .valid
          }
    
          private static func evaluate(password: String, requirement: PasswordValidator.Requirement) -> Bool {
              let predicateString = "^\(requirement.rawValue)$"
              let passwordTest = NSPredicate(format: "SELF MATCHES %@", predicateString)
              return passwordTest.evaluate(with: password)
          }
      }
    

    如您所见,每个PasswordValidator.Requirement 枚举案例都有一个包含谓词的关联值(非常未经测试!)

    现在在您的视图控制器中,您可以使用一个简单的函数来处理验证结果(从您的 passwordTextFieldDidChange(:) 函数调用:

    private func validate(password: String) {
    
            let validationResult = PasswordValidator.validate(password: password)
    
            switch validationResult {
            case .valid:
                // All should be checkmarks
                // self.updateIcons(missingRequirements: nil)
            case .invalid(let missingRequirements):
                // Change the icons
                // self.updateIcons(missingRequirements: missingRequirements)
            }
        }
    

    【讨论】:

    • 我将在接下来的几天内对此进行测试!会让你知道它是否有效。非常感谢您的回答,谢谢!
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2011-05-26
    • 2012-10-09
    相关资源
    最近更新 更多