textview publisher

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-05-01 17:36:20 -05:00
parent 5627c1b76e
commit 0ae2dd2706
2 changed files with 72 additions and 0 deletions

View File

@ -57,6 +57,7 @@
EA2DC9B02BE175BA004F58C5 /* RequiredRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA2DC9AF2BE175BA004F58C5 /* RequiredRule.swift */; };
EA2DC9B22BE175E6004F58C5 /* CharacterCountRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA2DC9B12BE175E6004F58C5 /* CharacterCountRule.swift */; };
EA2DC9B42BE2C6FE004F58C5 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA2DC9B32BE2C6FE004F58C5 /* TextField.swift */; };
EA2DC9B62BE2F4A1004F58C5 /* UITextView+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA2DC9B52BE2F4A1004F58C5 /* UITextView+Publisher.swift */; };
EA336171288B19200071C351 /* VDS.docc in Sources */ = {isa = PBXBuildFile; fileRef = EA336170288B19200071C351 /* VDS.docc */; };
EA336177288B19210071C351 /* VDS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA33616C288B19200071C351 /* VDS.framework */; };
EA33617C288B19210071C351 /* VDSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33617B288B19210071C351 /* VDSTests.swift */; };
@ -249,6 +250,7 @@
EA2DC9AF2BE175BA004F58C5 /* RequiredRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequiredRule.swift; sourceTree = "<group>"; };
EA2DC9B12BE175E6004F58C5 /* CharacterCountRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterCountRule.swift; sourceTree = "<group>"; };
EA2DC9B32BE2C6FE004F58C5 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = "<group>"; };
EA2DC9B52BE2F4A1004F58C5 /* UITextView+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextView+Publisher.swift"; sourceTree = "<group>"; };
EA33616C288B19200071C351 /* VDS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = VDS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EA33616F288B19200071C351 /* VDS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VDS.h; sourceTree = "<group>"; };
EA336170288B19200071C351 /* VDS.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = VDS.docc; sourceTree = "<group>"; };
@ -850,6 +852,7 @@
children = (
EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */,
EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */,
EA2DC9B52BE2F4A1004F58C5 /* UITextView+Publisher.swift */,
EAD8D2C028BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift */,
);
path = Publishers;
@ -1168,6 +1171,7 @@
EAB5FEED2927E1B200998C17 /* ButtonGroupPositionLayout.swift in Sources */,
EA4DB30228DCBCA500103EE3 /* Badge.swift in Sources */,
EA33624728931B050071C351 /* Initable.swift in Sources */,
EA2DC9B62BE2F4A1004F58C5 /* UITextView+Publisher.swift in Sources */,
EAF7F0A4289B017C00B287F5 /* LabelAttributeModel.swift in Sources */,
EA0B18022A9E236900F2D0CD /* SelectorGroupBase.swift in Sources */,
EA5F86D02A1F936100BC83E4 /* TabsContainer.swift in Sources */,

View File

@ -0,0 +1,68 @@
//
// 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()
}
}
}