Как создать функцию, когда пользователь перестает печатать в swift

У меня есть текстовое поле пользовательского интерфейса, и когда пользователь перестает печатать примерно через 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 func password3 начинает печатать) Когда я запускаю свой код, как только я нажимаю на текстовое поле, появляется галочка. Что я делаю не так.


person coder123    schedule 10.07.2020    source источник
comment
Не могли бы вы поделиться кодом скрытия и отображения галочки?   -  person Shashank Mishra    schedule 10.07.2020
comment
@ShashankMishra Сейчас это весь код, который у меня есть для галочки. Сейчас я просто работаю над тем, чтобы показать его, как только пользователь перестанет печатать.   -  person coder123    schedule 10.07.2020
comment
Помимо проблемы, вы не должны самостоятельно вызывать методы делегата, содержащие will, did или should.   -  person vadian    schedule 10.07.2020


Ответы (2)


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

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, который изначально скрыт.

person StonedStudio    schedule 10.07.2020
comment
Отлично спасибо - person coder123; 10.07.2020

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

person matt    schedule 10.07.2020