From 41f7e75e74c24a0a30b679d0b921215e6a0068f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kemal=20Tu=CC=88rk?= Date: Fri, 15 Nov 2024 00:42:18 +0300 Subject: [PATCH] Resolved the issue with the FormField property wrapper not responding to changes from onChange or onReceive listeners. --- Sources/Wrappers/FormField.swift | 36 +++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Sources/Wrappers/FormField.swift b/Sources/Wrappers/FormField.swift index d03b607..785e686 100644 --- a/Sources/Wrappers/FormField.swift +++ b/Sources/Wrappers/FormField.swift @@ -5,39 +5,51 @@ import Combine + @propertyWrapper public class FormField where Value == Validator.Value { - @Published - private var value: Value + + private var subject: CurrentValueSubject private let validator: Validator - public var projectedValue: AnyPublisher { - $value.eraseToAnyPublisher() - } - public var wrappedValue: Value { get { - value + subject.value } set { - value = newValue + subject.send(newValue) } } public init(wrappedValue value: Value, validator: () -> Validator) { - self.value = value + self.subject = CurrentValueSubject(value) self.validator = validator() } public init(wrappedValue value: Value, validator: Validator) { - self.value = value + self.subject = CurrentValueSubject(value) self.validator = validator } public init(initialValue value: Value, validator: () -> Validator) { - self.value = value + self.subject = CurrentValueSubject(value) self.validator = validator() } + + public static subscript( + _enclosingInstance object: EnclosingSelf, + wrapped wrappedKeyPath: ReferenceWritableKeyPath, + storage storageKeyPath: ReferenceWritableKeyPath + ) -> Value { + get { object[keyPath: storageKeyPath].wrappedValue } + set { + if let observableObject = object as? (any ObservableObject), + let objectWillChange = (observableObject.objectWillChange as any Publisher) as? ObservableObjectPublisher { + objectWillChange.send() + } + object[keyPath: storageKeyPath].wrappedValue = newValue + } + } public func validation( manager: FormManager, @@ -46,7 +58,7 @@ public class FormField where Value == }, onValidate: OnValidate? = nil ) -> ValidationContainer { - let pub: AnyPublisher = $value.eraseToAnyPublisher() + let pub: AnyPublisher = subject.eraseToAnyPublisher() return ValidationFactory.create( manager: manager, validator: validator,