UITextView data change swift UITextView data change swift swift swift

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