diff --git a/VDS/BaseClasses/Control.swift b/VDS/BaseClasses/Control.swift index cc2246aa..274d7d9b 100644 --- a/VDS/BaseClasses/Control.swift +++ b/VDS/BaseClasses/Control.swift @@ -35,13 +35,7 @@ open class Control: UIControl, ViewProtocol, UserInfoable, Clickable { //-------------------------------------------------- open var subscribers = Set() - open var onClickSubscriber: AnyCancellable? { - willSet { - if let onClickSubscriber { - onClickSubscriber.cancel() - } - } - } + open var onClickSubscriber: AnyCancellable? //-------------------------------------------------- // MARK: - Private Properties @@ -118,6 +112,8 @@ open class Control: UIControl, ViewProtocol, UserInfoable, Clickable { backgroundColor = .clear surface = .light isEnabled = true + onClick = nil + userInfo.removeAll() } //-------------------------------------------------- diff --git a/VDS/BaseClasses/Selector/SelectorBase.swift b/VDS/BaseClasses/Selector/SelectorBase.swift index 9552b50e..e74ca342 100644 --- a/VDS/BaseClasses/Selector/SelectorBase.swift +++ b/VDS/BaseClasses/Selector/SelectorBase.swift @@ -47,13 +47,7 @@ open class SelectorBase: Control, SelectorControlable { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- - open var onChangeSubscriber: AnyCancellable? { - willSet { - if let onChangeSubscriber { - onChangeSubscriber.cancel() - } - } - } + open var onChangeSubscriber: AnyCancellable? open var size = CGSize(width: 20, height: 20) { didSet { setNeedsUpdate() } } @@ -135,4 +129,8 @@ open class SelectorBase: Control, SelectorControlable { /// This will change the state of the Selector and execute the actionBlock if provided. open func toggle() { } + open override func reset() { + super.reset() + onChange = nil + } } diff --git a/VDS/BaseClasses/Selector/SelectorGroupBase.swift b/VDS/BaseClasses/Selector/SelectorGroupBase.swift index 64b3cdee..997a71b2 100644 --- a/VDS/BaseClasses/Selector/SelectorGroupBase.swift +++ b/VDS/BaseClasses/Selector/SelectorGroupBase.swift @@ -75,13 +75,7 @@ open class SelectorGroupBase: Control, SelectorGroup, } } - open var onChangeSubscriber: AnyCancellable? { - willSet { - if let onChangeSubscriber { - onChangeSubscriber.cancel() - } - } - } + open var onChangeSubscriber: AnyCancellable? /// Whether the Control is enabled or not. override open var isEnabled: Bool { @@ -130,6 +124,7 @@ open class SelectorGroupBase: Control, SelectorGroup, /// Resets to default settings. open override func reset() { super.reset() + onChange = nil items.forEach{ $0.reset() } } } diff --git a/VDS/BaseClasses/Selector/SelectorItemBase.swift b/VDS/BaseClasses/Selector/SelectorItemBase.swift index 1900c2c5..9eee8f29 100644 --- a/VDS/BaseClasses/Selector/SelectorItemBase.swift +++ b/VDS/BaseClasses/Selector/SelectorItemBase.swift @@ -61,13 +61,7 @@ open class SelectorItemBase: Control, Errorable, //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- - open var onChangeSubscriber: AnyCancellable? { - willSet { - if let onChangeSubscriber { - onChangeSubscriber.cancel() - } - } - } + open var onChangeSubscriber: AnyCancellable? /// Label used to render labelText. open var label = Label().with { @@ -223,6 +217,7 @@ open class SelectorItemBase: Control, Errorable, value = nil isSelected = false + onChange = nil shouldUpdateView = true setNeedsUpdate() } diff --git a/VDS/Components/Buttons/ButtonBase.swift b/VDS/Components/Buttons/ButtonBase.swift index b0694848..80010ee5 100644 --- a/VDS/Components/Buttons/ButtonBase.swift +++ b/VDS/Components/Buttons/ButtonBase.swift @@ -38,13 +38,7 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable { /// Set of Subscribers for any Publishers for this Control. open var subscribers = Set() - open var onClickSubscriber: AnyCancellable? { - willSet { - if let onClickSubscriber { - onClickSubscriber.cancel() - } - } - } + open var onClickSubscriber: AnyCancellable? //-------------------------------------------------- // MARK: - Private Properties @@ -140,6 +134,8 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable { isEnabled = true text = nil accessibilityCustomActions = [] + onClick = nil + userInfo.removeAll() shouldUpdateView = true setNeedsUpdate() } diff --git a/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift b/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift index 864397d3..cf3afdc3 100644 --- a/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift +++ b/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift @@ -172,8 +172,6 @@ open class ButtonIcon: Control, Changeable, FormFieldable { /// Used to move the icon inside the button in both x and y axis. open var iconOffset: CGPoint = .init(x: 0, y: 0) { didSet { setNeedsUpdate() } } - open var onChangeSubscriber: AnyCancellable? - open var inputId: String? { didSet { setNeedsUpdate() } } open var value: AnyHashable? { didSet { setNeedsUpdate() } } @@ -436,6 +434,7 @@ open class ButtonIcon: Control, Changeable, FormFieldable { showBadgeIndicator = false selectable = false badgeIndicatorModel = nil + onChange = nil shouldUpdateView = true setNeedsUpdate() } diff --git a/VDS/Components/RadioBox/RadioBoxItem.swift b/VDS/Components/RadioBox/RadioBoxItem.swift index de6223e1..17d509c2 100644 --- a/VDS/Components/RadioBox/RadioBoxItem.swift +++ b/VDS/Components/RadioBox/RadioBoxItem.swift @@ -52,13 +52,7 @@ open class RadioBoxItem: Control, Changeable, FormFieldable { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- - open var onChangeSubscriber: AnyCancellable? { - willSet { - if let onChangeSubscriber { - onChangeSubscriber.cancel() - } - } - } + open var onChangeSubscriber: AnyCancellable? /// Label used to render the text. open var textLabel = Label().with { @@ -218,6 +212,7 @@ open class RadioBoxItem: Control, Changeable, FormFieldable { value = nil isSelected = false + onChange = nil shouldUpdateView = true setNeedsUpdate() diff --git a/VDS/Components/TextFields/EntryFieldBase.swift b/VDS/Components/TextFields/EntryFieldBase.swift index 7ce12d75..9f7cf49d 100644 --- a/VDS/Components/TextFields/EntryFieldBase.swift +++ b/VDS/Components/TextFields/EntryFieldBase.swift @@ -119,13 +119,7 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- - open var onChangeSubscriber: AnyCancellable? { - willSet { - if let onChangeSubscriber { - onChangeSubscriber.cancel() - } - } - } + open var onChangeSubscriber: AnyCancellable? open var titleLabel = Label().with { $0.setContentCompressionResistancePriority(.required, for: .vertical) @@ -304,6 +298,7 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { defaultValue = nil required = false readOnly = false + onChange = nil } /// Used to make changes to the View based off a change events or from local properties. diff --git a/VDS/Components/TileContainer/TileContainer.swift b/VDS/Components/TileContainer/TileContainer.swift index 61b91eaf..480cbc09 100644 --- a/VDS/Components/TileContainer/TileContainer.swift +++ b/VDS/Components/TileContainer/TileContainer.swift @@ -8,6 +8,7 @@ import Foundation import VDSTokens import UIKit +import Combine @objc(VDSTileContainer) open class TileContainer: TileContainerBase { @@ -43,7 +44,6 @@ open class TileContainer: TileContainerBase { } open class TileContainerBase: Control where PaddingType.ValueType == CGFloat { - //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -111,6 +111,12 @@ open class TileContainerBase: Control where Padding //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- + public override var onClickSubscriber: AnyCancellable? { + didSet { + isAccessibilityElement = onClickSubscriber != nil + } + } + /// This takes an image source url and applies it as a background image. open var backgroundImage: UIImage? { didSet { setNeedsUpdate() } } diff --git a/VDS/Components/Tilelet/Tilelet.swift b/VDS/Components/Tilelet/Tilelet.swift index ba03ed5f..77477576 100644 --- a/VDS/Components/Tilelet/Tilelet.swift +++ b/VDS/Components/Tilelet/Tilelet.swift @@ -105,12 +105,6 @@ open class Tilelet: TileContainerBase { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- - public override var onClickSubscriber: AnyCancellable? { - didSet { - isAccessibilityElement = onClickSubscriber != nil - } - } - /// Title lockup positioned in the contentView. open var titleLockup = TitleLockup().with { $0.standardStyleConfiguration = .init(styleConfigurations: [ diff --git a/VDS/Components/Toggle/Toggle.swift b/VDS/Components/Toggle/Toggle.swift index 9e77ed12..b73630d6 100644 --- a/VDS/Components/Toggle/Toggle.swift +++ b/VDS/Components/Toggle/Toggle.swift @@ -88,13 +88,7 @@ open class Toggle: Control, Changeable, FormFieldable { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- - open var onChangeSubscriber: AnyCancellable? { - willSet { - if let onChangeSubscriber { - onChangeSubscriber.cancel() - } - } - } + open var onChangeSubscriber: AnyCancellable? /// Actual toggle used in this component. open var toggleView = ToggleView().with { @@ -231,6 +225,7 @@ open class Toggle: Control, Changeable, FormFieldable { textPosition = .left inputId = nil value = nil + onChange = nil shouldUpdateView = true setNeedsUpdate() } diff --git a/VDS/Components/Toggle/ToggleView.swift b/VDS/Components/Toggle/ToggleView.swift index ef88d914..16b8307e 100644 --- a/VDS/Components/Toggle/ToggleView.swift +++ b/VDS/Components/Toggle/ToggleView.swift @@ -166,6 +166,7 @@ open class ToggleView: Control, Changeable, FormFieldable { value = nil toggleView.backgroundColor = toggleColorConfiguration.getColor(self) knobView.backgroundColor = knobColorConfiguration.getColor(self) + onChange = nil shouldUpdateView = true setNeedsUpdate() } diff --git a/VDS/Protocols/Changeable.swift b/VDS/Protocols/Changeable.swift index 6ef3eb8e..c44fa841 100644 --- a/VDS/Protocols/Changeable.swift +++ b/VDS/Protocols/Changeable.swift @@ -26,6 +26,8 @@ extension Changeable { .sink { c in newValue(c) } + } else { + onChangeSubscriber = nil } } } diff --git a/VDS/Protocols/Clickable.swift b/VDS/Protocols/Clickable.swift index 29b66aaf..eddcfa3c 100644 --- a/VDS/Protocols/Clickable.swift +++ b/VDS/Protocols/Clickable.swift @@ -20,6 +20,7 @@ extension Clickable { public var onClick: ((Self) -> ())? { get { return nil } set { + onClickSubscriber?.cancel() if let newValue { onClickSubscriber = publisher(for: .touchUpInside) .sink { [weak self] c in @@ -27,7 +28,6 @@ extension Clickable { newValue(c) } } else { - onClickSubscriber?.cancel() onClickSubscriber = nil } }