vds_ios/VDS/Publishers/UITextView+Publisher.swift
Matt Bruce 0ae2dd2706 textview publisher
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2024-05-01 17:36:20 -05:00

69 lines
2.1 KiB
Swift

//
// UITextView+Publisher.swift
// VDS
//
// Created by Matt Bruce on 5/1/24.
//
import Foundation
import UIKit
import Combine
extension UITextView {
public enum Event {
case editingChanged
case editingDidBegin
case editingDidEnd
}
public func publisher(for event: Event) -> AnyPublisher<UITextView, Never> {
TextViewPublisher(textView: self).publisher(for: event)
}
}
class TextViewPublisher: NSObject, UITextViewDelegate {
var textDidChangePublisher: AnyPublisher<UITextView, Never>
var didBeginEditingPublisher: AnyPublisher<UITextView, Never>
var didEndEditingPublisher: AnyPublisher<UITextView, Never>
private var cancellables = Set<AnyCancellable>()
init(textView: UITextView) {
textDidChangePublisher = NotificationCenter.default.publisher(for: UITextView.textDidChangeNotification, object: textView)
.compactMap { notification in
(notification.object as? UITextView)
}
.eraseToAnyPublisher()
didBeginEditingPublisher = NotificationCenter.default.publisher(for: UITextView.textDidBeginEditingNotification, object: textView)
.compactMap { notification in
(notification.object as? UITextView)
}
.eraseToAnyPublisher()
didEndEditingPublisher = NotificationCenter.default.publisher(for: UITextView.textDidEndEditingNotification, object: textView)
.compactMap { notification in
(notification.object as? UITextView)
}
.eraseToAnyPublisher()
}
func publisher(for event: UITextView.Event) -> AnyPublisher<UITextView, Never> {
switch event {
case .editingChanged:
return textDidChangePublisher
.map { $0 }
.eraseToAnyPublisher()
case .editingDidBegin:
return didBeginEditingPublisher
.map { $0 }
.eraseToAnyPublisher()
case .editingDidEnd:
return didEndEditingPublisher
.map { $0 }
.eraseToAnyPublisher()
}
}
}