UITextView data change swift
You need to set UITextView delegate and implement textViewDidChange: method in it. Unfortunately, I do not know if swift documentation is available online. All the links go to the objective-c documentation.
The code will look like this: (updated for 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 }}
For my case, I wanted the implementation to be independent from a UIViewController, so i dont need to assign a delegate just for text changes. Or even maybe there is some kind of validation on the UITextView, and you wanna contain it per field instead of a delegate managing a lot of complicated logic.
It requires to subclass UITextView, but its very much worth it 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)?}
Set delegate
of UITextView
.Refer UITextViewDelegate
Write this in viewDidLoad
bodyText!.delegate = self