Как запустить код, когда пользователь перестает нажимать кнопку?

#ios #swift #uibutton #uikit

#iOS #swift #uibutton #uikit

Вопрос:

У меня есть кнопка «Глаз» рядом с текстовым полем моего пароля, для которой предполагается установить значение false для свойства безопасного ввода текста текстового поля на время нажатия пользователем, оно должно заканчиваться, когда пользователь убирает палец.

Мне успешно удалось установить для свойства значение false, когда пользователь нажимает, используя цель с событием touchUpInside, но я не знаю, как определить, что это событие остановлено. И это то, что я ищу.

До этого я использовал распознаватель жестов с длительным нажатием, но проблема в том, что запуск кода занимал слишком много времени. Что нормально, потому что это долгое нажатие, но это не то поведение, которое я хочу.

Мой код был :

 let gesture = UILongPressGestureRecognizer(target: self, action: #selector(eyePressed(sender:)))
passwordEyeButton.addGestureRecognizer(gesture)

@objc func eyePressed(sender : UILongPressGestureRecognizer){
    switch sender.state {
    case .began :
        passwordEyeButton.setImage(eyeImage, for: .normal)
        passwordTextField.isSecureTextEntry = false
    case .ended :
        passwordEyeButton.setImage(crossedEyeImage, for: .normal)
        passwordTextField.isSecureTextEntry = true
    default :
        print("default state")
    }
}
  

Ответ №1:

Вам нужно управлять 3 событиями: .touchDown , .touchUpInside и .touchUpOutside .

Ваше намерение состоит в том, чтобы показывать пароль при нажатии кнопки и скрывать его при отпускании пальца, и поэтому, если вы реализуете только .touchUpInside для обнаружения того, что пользователь перестал нажимать кнопку, это НЕ сработает, если он выпустит палец за пределы кнопки.

 override func viewDidLoad() {
    super.viewDidLoad()
    button.addTarget(self, action: #selector(showPassword), for: .touchDown)
    button.addTarget(self, action: #selector(hidePassword), for: .touchUpInside)
    button.addTarget(self, action: #selector(hidePassword), for: .touchUpOutside)   
}

@objc func showPassword(_ sender: Any) {
    print("show password")
}

@objc func hidePassword(_ sender: Any) {
    print("hide password")
}
  

Комментарии:

1. Зачем подкрашивать снаружи?

Ответ №2:

Добавьте событие касания вниз и событие касания вверх внутри для вашей кнопки:

Вы можете использовать раскадровку, чтобы добавить их, поэтому нет необходимости добавлять цели вручную.

 //Touch down
@IBAction func touched(_ sender: UIButton) {
        print("show password")
}

//Touch up inside 
 @IBAction func touchUp(_ sender: UIButton) {
        print("hide password")
 }
  

Ответ №3:

Я бы добавил две цели в UIButton для двух событий:

  • touchDown для дескриптора при нажатии кнопки
  • touchUpInside для дескриптора, когда пользователь убирает палец с кнопки

 override func viewDidLoad() {
    super.viewDidLoad()
    passwordEyeButton.addTarget(self, action: #selector(pressBegan(_:)), for: .touchDown)
    passwordEyeButton.addTarget(self, action: #selector(pressEnded(_:)), for: .touchUpInside)
}

@objc func pressBegan(_ sender: UIButton) {
    passwordEyeButton.setImage(eyeImage, for: .normal)
    passwordTextField.isSecureTextEntry = false
}

@objc func pressEnded(_ sender: UIButton) {
    passwordEyeButton.setImage(crossedEyeImage, for: .normal)
    passwordTextField.isSecureTextEntry = true
}