Проблема пользовательского интерфейса при изменении пользовательского состояния UIButton - PullRequest
0 голосов
/ 20 июня 2019

У меня 2 UITextField и кастом UIButton.Я проверяю, есть ли значение как в UITextField, так и в enable кнопке.Если пользователь возвращается и удаляет значение в любом из них, состояние кнопки возвращается к disabled.Моя проблема с пользовательским интерфейсом.Когда включено - кнопка должна быть белой с фиолетовым цветом для заголовка, а когда отключена, она должна иметь чистый цвет (как цвет фона) и светло-серый для заголовка и цвета рамки.Это метод для этого UIButton:

func authButton() {
    layer.cornerRadius = 5
    layer.borderWidth = 1
    clipsToBounds = true
    if state ==  .normal {
        layer.borderColor = UIColor.white.cgColor
        backgroundColor = UIColor.white
        setTitleColor(Colors.purpleDarker, for: .normal)
    }
    else if state == .disabled {
        layer.borderColor = UIColor.lightText.cgColor
        backgroundColor = UIColor.gray
        setTitleColor(.lightText, for: .disabled)
    }
}

Работает нормально до тех пор, пока пользователь не удалит содержимое из текстового поля, тогда фон останется белым и заголовок будет «исчезать» (или его не будет видно),Это работает только в том случае, если пользователь нажимает кнопку «Готово» по ключевому слову, а затем изменяет состояние на «отключено».

Вот как я проверяю эти изменения в UITextField (делегаты установлены для обоих текстовых полей):

func handleTextFields() {
    emailTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
    passwordTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
}

@objc func textFieldDidChange() {
    print("11111")
    guard let email = emailTextField.text, !email.isEmpty,
          let pass = passwordTextField.text, !pass.isEmpty
    else {
        loginButton.isEnabled = false
        return
    }
    loginButton.isEnabled = true
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    switch textField {
    case emailTextField:
        passwordTextField.becomeFirstResponder()
    case passwordTextField:
        passwordTextField.resignFirstResponder()
    default:
        break
    }
    return true
}

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Основано на ваших комментариях ...

Move:

loginButton.authButton()

с viewWillLayoutSubviews() до viewDidLoad(), затем измените ваш textFieldDidChange() функционал на:

@objc func textFieldDidChange() {
    print("11111")
    guard let email = emailTextField.text, !email.isEmpty,
          let pass = passwordTextField.text, !pass.isEmpty
    else {
        loginButton.isEnabled = false
        // update your customized "state"
        loginButton.authButton()
        return
    }
    loginButton.isEnabled = true
    // update your customized "state"
    loginButton.authButton()
}
0 голосов
/ 20 июня 2019

Попробуйте, может быть, это поможет, без вызова authButton () в viewWillLayoutSubviews

extension UIButton {
    open override func draw(_ rect: CGRect) {
        authButton()
    }
    func authButton() {
        layer.cornerRadius = 5
        layer.borderWidth = 1
        clipsToBounds = true
        if state ==  .normal {
            layer.borderColor = UIColor.white.cgColor
            backgroundColor = UIColor.white
            setTitleColor(.red, for: .normal)
        }
        else if state == .disabled {
            layer.borderColor = UIColor.lightText.cgColor
            backgroundColor = UIColor.yellow
            setTitleColor(.yellow, for: .disabled)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...