Как создать функцию, когда пользователь перестает быстро печатать - PullRequest
0 голосов
/ 10 июля 2020

У меня есть текстовое поле пользовательского интерфейса, и когда пользователь прекращает печатать примерно через 1 секунду, я хочу, чтобы появилась галочка. У меня есть следующий код:

   @objc func getHintsFromTextField(textField: UITextField) {
       print("Hints for textField: \(textField)")
   }
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,
    replacementString string: String) -> Bool {
    NSObject.cancelPreviousPerformRequests(
        withTarget: self,
        selector: #selector(ViewController.getHintsFromTextField),
        object: textField)
    self.perform(
        #selector(ViewController.getHintsFromTextField),
        with: textField,
        afterDelay: 3.0)
    return true
}
```    @IBAction func password3(_ sender: UITextField) {
        if textField(passwordSignUp, shouldChangeCharactersIn: NSMakeRange(5, 10), replacementString: "") == true {
            
            
            let imageView = UIImageView()
            let image1 = #imageLiteral(resourceName: "icons8-ok-28")
             imageView.image = image1
            self.passwordSignUp?.rightView = imageView
            self.passwordSignUp?.rightViewMode = UITextField.ViewMode.always
            self.passwordSignUp?.rightViewMode = .always
            errorLabel?.alpha = 0
            
        }
    }

(Кстати, IBAction fun c password3 начинает печатать) Когда я запускаю свой код, как только нажимаю на текстовое поле появится галочка. Что я делаю не так.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Я бы использовал что-то вроде:

func textFieldDidChangeSelection(_ textField: UITextField) {
    
    checkmarkImageView.isHidden = True
    
    let timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: true)
}

И:

@objc func fireTimer() {
    
    checkmarkImageView.isHidden = False
}

Вместо того, чтобы каждый раз создавать imageView, настройте его как IBOutlet, который изначально скрыт.

0 голосов
/ 10 июля 2020

Обратите внимание, что вы используете здесь shouldChangeCharactersIn совершенно неправильно; Если ваша цель - получить уведомление о том, что текст был изменен пользователем, то это и есть textDidChangeNotification. Если вы используете платформу Combine для подписки на это уведомление и применяете оператор debounce, то, что вы пытаетесь сделать, становится совершенно тривиальным.

...