diff --git a/VDSSample/ViewControllers/CheckboxViewController.swift b/VDSSample/ViewControllers/CheckboxViewController.swift index 5d8d984..7bce31a 100644 --- a/VDSSample/ViewControllers/CheckboxViewController.swift +++ b/VDSSample/ViewControllers/CheckboxViewController.swift @@ -12,16 +12,20 @@ import VDSColorTokens import Combine class CheckboxViewController: UIViewController, StoryboardInitable { + deinit { + print("\(Self.self) deinit") + } + enum PickerType { case surface } static var storyboardId: String = "checkbox" static var storyboardName: String = "Components" - + @IBOutlet weak var checkboxContainerView: UIView! @IBOutlet weak var picker: UIPickerView! @IBOutlet weak var surfaceLabel: UILabel! - + @IBOutlet weak var disabledSwitch: UISwitch! @IBOutlet weak var labelTextField: UITextField! @IBOutlet weak var childTextField: UITextField! @@ -31,7 +35,7 @@ class CheckboxViewController: UIViewController, StoryboardInitable { var model = DefaultCheckboxModel() var checkbox = Checkbox() var subscribers = Set() - + override func viewDidLoad() { super.viewDidLoad() checkboxContainerView.addSubview(checkbox) @@ -56,7 +60,7 @@ class CheckboxViewController: UIViewController, StoryboardInitable { LabelAttributeFont(location: 2, length: 5, style: .BoldTitleLarge, color: UIColor.red.hexString!) ] model.errorText = "Error Text" - + checkbox.set(with: model) //setup UI @@ -66,29 +70,28 @@ class CheckboxViewController: UIViewController, StoryboardInitable { childTextField.text = model.childText showErrorSwitch.isOn = model.hasError errorTextField.text = model.errorText - + } func setupBinding() { //create the subject let modelSubject = CurrentValueSubject(model) - //assign - this will auto overwrite any changes - modelSubject.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).assign(to: \.model, on: self).store(in: &subscribers) - //bind checkbox.createBinding(with: modelSubject, storeIn: &subscribers) - - //print out on subject changes - modelSubject.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] model in - - self?.showErrorSwitch.isOn = model.hasError - print("CheckboxViewController hasError: \(model.hasError)") - print("CheckboxViewController selected: \(model.selected)") - - }.store(in: &subscribers) - } + //update the model + //print out on subject changes + modelSubject + .debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main) + .sink { [weak self] updatedModel in + self?.model = updatedModel + self?.showErrorSwitch.isOn = updatedModel.hasError + print("CheckboxViewController hasError: \(updatedModel.hasError)") + print("CheckboxViewController selected: \(updatedModel.selected)") + }.store(in: &subscribers) + } + @IBAction func disabledChanged(_ sender: UISwitch) { checkbox.disabled = sender.isOn @@ -107,12 +110,12 @@ class CheckboxViewController: UIViewController, StoryboardInitable { @IBAction func showErrorChanged(_ sender: UISwitch) { checkbox.hasError = sender.isOn } - + @IBAction func onErrorTextDidEnd(_ sender: UITextField) { checkbox.errorText = sender.text sender.resignFirstResponder() } - + @IBAction func surfaceClick(_ sender: Any) { pickerType = .surface } @@ -126,7 +129,7 @@ class CheckboxViewController: UIViewController, StoryboardInitable { picker.delegate = object picker.dataSource = object } - + switch pickerType{ case .surface: update(object: surfacePicker) diff --git a/VDSSample/ViewControllers/RadioButtonViewController.swift b/VDSSample/ViewControllers/RadioButtonViewController.swift index 5d928d9..ae8b6b0 100644 --- a/VDSSample/ViewControllers/RadioButtonViewController.swift +++ b/VDSSample/ViewControllers/RadioButtonViewController.swift @@ -12,23 +12,27 @@ import VDSColorTokens import Combine class RadioButtonViewController: UIViewController, StoryboardInitable { + deinit { + print("\(Self.self) deinit") + } + enum PickerType { case surface } static var storyboardId: String = "radioButton" static var storyboardName: String = "Components" - + @IBOutlet weak var componentContainerView: UIView! @IBOutlet weak var picker: UIPickerView! @IBOutlet weak var surfaceLabel: UILabel! - + @IBOutlet weak var disabledSwitch: UISwitch! @IBOutlet weak var labelTextField: UITextField! @IBOutlet weak var childTextField: UITextField! @IBOutlet weak var showErrorSwitch: UISwitch! -// var radioButton: RadioButton! -// var radioButton2: RadioButton! + // var radioButton: RadioButton! + // var radioButton2: RadioButton! var radioButtonGroup = RadioButtonGroup() public var model = DefaultRadioButtonGroupModel() public var subscribers = Set() @@ -36,7 +40,7 @@ class RadioButtonViewController: UIViewController, StoryboardInitable { override func viewDidLoad() { super.viewDidLoad() view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) - + componentContainerView.addSubview(radioButtonGroup) radioButtonGroup.leadingAnchor.constraint(equalTo: componentContainerView.leadingAnchor, constant: 10).isActive = true radioButtonGroup.topAnchor.constraint(equalTo: componentContainerView.topAnchor, constant: 20).isActive = true @@ -60,7 +64,7 @@ class RadioButtonViewController: UIViewController, StoryboardInitable { LabelAttributeActionModel(location: 31, length: 10){ print("clicked on the word 'conditions'") }, LabelAttributeFont(location: 2, length: 5, style: .BoldTitleLarge, color: UIColor.red.hexString!) ] - + var model2 = DefaultRadioButtonModel() model2.value = "model 2 Value" model2.childText = "Radio Sample 2" @@ -80,25 +84,25 @@ class RadioButtonViewController: UIViewController, StoryboardInitable { //create the subject let modelSubject = CurrentValueSubject(model) - //assign - this will auto overwrite any changes - modelSubject.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).assign(to: \.model, on: self).store(in: &subscribers) - //bind radioButtonGroup.createBinding(with: modelSubject, storeIn: &subscribers) - + + //update the model //print out on subject changes - modelSubject.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] model in - - self?.showErrorSwitch.isOn = model.hasError - print("RadioButtonViewController hasError: \(model.hasError)") - - if let selectedModel = model.selectedModel { - print("RadioButtonViewController selectedModel Id: \(selectedModel.id)") + modelSubject + .debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main) + .sink { [weak self] updatedModel in + self?.model = updatedModel + self?.showErrorSwitch.isOn = updatedModel.hasError + print("RadioButtonViewController hasError: \(updatedModel.hasError)") + + if let selectedModel = updatedModel.selectedModel { + print("RadioButtonViewController selectedModel Id: \(selectedModel.id)") + } } - }.store(in: &subscribers) + .store(in: &subscribers) } - - + var radioButton: RadioButton? { radioButtonGroup.selectorViews.first } @@ -119,7 +123,7 @@ class RadioButtonViewController: UIViewController, StoryboardInitable { @IBAction func showErrorChanged(_ sender: UISwitch) { radioButtonGroup.hasError = sender.isOn } - + @IBAction func surfaceClick(_ sender: Any) { pickerType = .surface } @@ -133,7 +137,7 @@ class RadioButtonViewController: UIViewController, StoryboardInitable { picker.delegate = object picker.dataSource = object } - + switch pickerType{ case .surface: update(object: surfacePicker) diff --git a/VDSSample/ViewControllers/TestViewController.swift b/VDSSample/ViewControllers/TestViewController.swift index e7d3d26..8abe2e1 100644 --- a/VDSSample/ViewControllers/TestViewController.swift +++ b/VDSSample/ViewControllers/TestViewController.swift @@ -34,9 +34,6 @@ extension Bindable { } class TextFieldBindingCell: UIView, Bindable { - deinit { - print("\(Self.self) deinit") - } //bindable var model: User @@ -100,6 +97,9 @@ class TextFieldBindingCell: UIView, Bindable { } @objcMembers class TestViewController: UIViewController, Initable { + deinit { + print("\(Self.self) deinit") + } var user = User(firstName: "Joe", lastName: "User") private var subscriptions = Set()