同时检查所有文本字段并仅在有文本时启用按钮

check all textfields simultaneously & only enable button if they have text

我想根据密码和确认密码文本字段中的文本启用和更改按钮的颜色。所以我在网上找到了这段代码:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let tfConfirmPasswordText = (tfConfirmPassword.text! as NSString).replacingCharacters(in: range, with: string)
    if tfConfirmPasswordText.isEmpty {
        btnContinue.backgroundColor = UIColor(named: "labelColor")
        btnContinue.isEnabled = false
    }
        else if tfPassword.text != "" && !tfConfirmPasswordText.isEmpty {
        btnContinue.backgroundColor = UIColor(named: "accentColor")
        btnContinue.isEnabled = true
    }
     return true
    }

此代码确实有效,使用这些条件,它将根据 confirmPassword 文本字段启用或禁用继续按钮。 但问题是,在填充 passwordconfirmPassword 文本字段后,如果我从 password 字段中删除文本,它仍会保持按钮启用状态,并且仅在从 [=11] 中删除文本时才禁用它=] 文本字段。 如果我在 viewDidLoafd() 中将 password.delegate = selfconfirmPassword.delgate = self 并排放置,当我在任何文本字段中放置超过 1 个字符时它会崩溃。

有没有办法通过始终检查两个文本字段而不是只检查一个来启用或禁用按钮。确认密码文本字段?

我认为你错过了一个测试: 而不是

if tfConfirmPasswordText.isEmpty

我会写

if tfConfirmPasswordText.isEmpty || tfpasswordText.isEmpty

我没有使用 shouldChangeCharactersIn ,而是像下面那样使用它来使其工作

    override func viewDidLoad() {
            super.viewDidLoad()
          //initially at disabled 
            disabledButton()
            [tfPassword, tfConfirmPasswordText].forEach({ [=10=].addTarget(self, action: #selector(textFieldEditingDidChange), for: .editingChanged) })
        }
        
        @objc func textFieldEditingDidChange(sender: UITextField) {
            
            guard
                let tfPasswordTxtValue = tfPassword.text, !tfPasswordTxtValue.isEmpty,
                let tfConfirmPasswordTextValue = tfConfirmPasswordText.text, !tfConfirmPasswordTextValue.isEmpty
                    
            else {
                disabledButton()
                return
            }
            enableButton()
            
        }

     func disabledButton(){
      btnContinue.backgroundColor = UIColor(named: "labelColor")
      btnContinue.isEnabled = false
     }

    func enableButton(){
     btnContinue.isEnabled = true
   }