web-dev-qa-db-fra.com

UITextView changement de données rapide

Comment détecter un changement de données dans une UITextView avec Swift? Le code suivant ne fait aucune détection.

Je déclare la UITextView:

@IBOutlet weak var bodyText: UITextView!

optional func textViewDidChange(_ textView: UITextView!) {
    println(bodyText.text)
}

Merci Scott

29
user3896519

Vous devez définir UITextView delegate et implémenter textViewDidChange: method. Malheureusement, je ne sais pas si la documentation Swift est disponible en ligne. Tous les liens mènent à la documentation objective-c.

Le code ressemblera à ceci: (updated pour Swift 4.2)

class ViewController: UIViewController, UITextViewDelegate { //If your class is not conforms to the UITextViewDelegate protocol you will not be able to set it as delegate to UITextView

    @IBOutlet weak var bodyText: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        bodyText.delegate = self //Without setting the delegate you won't be able to track UITextView events
    }

    func textViewDidChange(_ textView: UITextView) { //Handle the text changes here
        print(textView.text); //the textView parameter is the textView where text was changed
    }
}
74
Sergey Pekar

Définissez delegate of UITextView. Refer UITextViewDelegate

Écrivez ceci dans viewDidLoad

bodyText!.delegate = self
5
codester

Pour Swift 4:

func textViewDidChange(_ textView: UITextView) {
  // Your code here
}

2
Andy Feng

Dans mon cas, je voulais que l'implémentation soit indépendante d'un UIViewController, je n'ai donc pas besoin d'affecter un délégué aux modifications de texte. Ou même peut-être qu'il existe une sorte de validation sur UITextView et que vous voulez la contenir par champ plutôt que par un délégué gérant beaucoup de logique compliquée.

Il faut sous-classer UITextView, mais cela en vaut la peine imo:

class TextView: UITextView {

    convenience init() {
        self.init(frame: CGRect.zero, textContainer: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(textDidChangeNotification), name: UITextView.textDidChangeNotification , object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func textDidChangeNotification(_ notif: Notification) {
        guard self == notif.object as? UITextView else {
            return
        }
        textDidChange()
    }

    func textDidChange() {
        // the text in the textview just changed, below goes the code for whatever you need to do given this event

        // or you can just set the textDidChangeHandler closure to execute every time the text changes, useful if you want to keep logic out of the class
        textDidChangeHandler?()
    }

    var textDidChangeHandler: (()->Void)?

}
0
Lucas Chwe