iOS 13 with Combine
public extension UITextView { var textDidChangePublisher: AnyPublisher<String, Never> { NotificationCenter.default .publisher(for: UITextView.textDidChangeNotification, object: self) .compactMap { $0.object as? UITextView } .compactMap(\.text) .eraseToAnyPublisher() } var attributedTextDidChangePublisher: AnyPublisher<NSAttributedString, Never> { NotificationCenter.default .publisher(for: UITextView.textDidChangeNotification, object: self) .compactMap { $0.object as? UITextView } .compactMap(\.attributedText) .eraseToAnyPublisher() }}
var cancellable = Set<AnyCancellable>()textView.textDidChangePublisher .removeDuplicates() .sink { [weak self] newValue in guard let self = self else { return } // what you want } .store(in: &cancellable)