Как запустить код, когда пользователь перестает нажимать кнопку? - PullRequest
1 голос
/ 11 марта 2019

У меня есть кнопка «глаз» рядом с моим текстовым полем пароля, которое, как предполагается, должно установить значение 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")
    }
}

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Я бы добавил две цели к 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
}
1 голос
/ 11 марта 2019

Вам нужно управлять 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 голос
/ 11 марта 2019

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

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

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

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