From 1b4d40f67e1257923490ffec0fd81902d74491ea Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 12 Aug 2022 16:00:39 -0500 Subject: [PATCH] refactored checkbox Signed-off-by: Matt Bruce --- .../CheckboxViewController.swift | 53 ++++++++++++++----- .../RadioButtonViewController.swift | 2 +- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/VDSSample/ViewControllers/CheckboxViewController.swift b/VDSSample/ViewControllers/CheckboxViewController.swift index a206a5a..5d8d984 100644 --- a/VDSSample/ViewControllers/CheckboxViewController.swift +++ b/VDSSample/ViewControllers/CheckboxViewController.swift @@ -9,6 +9,7 @@ import Foundation import UIKit import VDS import VDSColorTokens +import Combine class CheckboxViewController: UIViewController, StoryboardInitable { enum PickerType { @@ -27,11 +28,24 @@ class CheckboxViewController: UIViewController, StoryboardInitable { @IBOutlet weak var showErrorSwitch: UISwitch! @IBOutlet weak var errorTextField: UITextField! - var checkbox: Checkbox! + var model = DefaultCheckboxModel() + var checkbox = Checkbox() + var subscribers = Set() override func viewDidLoad() { super.viewDidLoad() - var model = DefaultCheckboxModel() + checkboxContainerView.addSubview(checkbox) + checkbox.leadingAnchor.constraint(equalTo: checkboxContainerView.leadingAnchor, constant: 10).isActive = true + checkbox.bottomAnchor.constraint(equalTo: checkboxContainerView.bottomAnchor, constant: -20).isActive = true + checkbox.topAnchor.constraint(equalTo: checkboxContainerView.topAnchor, constant: 20).isActive = true + checkbox.trailingAnchor.constraint(equalTo: checkboxContainerView.trailingAnchor, constant: 10).isActive = true + view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) + setupPicker() + createModel() + setupBinding() + } + + func createModel() { model.labelText = "Terms and conditions" model.childText = "I agree to Verizon's terms and conditions click here" model.childTextAttributes = [ @@ -42,25 +56,40 @@ 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 surfaceLabel.text = model.surface.rawValue disabledSwitch.isOn = model.selected labelTextField.text = model.labelText childTextField.text = model.childText showErrorSwitch.isOn = model.hasError errorTextField.text = model.errorText - - checkbox = Checkbox(with: model) - checkbox.translatesAutoresizingMaskIntoConstraints = false - checkboxContainerView.addSubview(checkbox) - checkbox.leadingAnchor.constraint(equalTo: checkboxContainerView.leadingAnchor, constant: 10).isActive = true - checkbox.bottomAnchor.constraint(equalTo: checkboxContainerView.bottomAnchor, constant: -20).isActive = true - checkbox.topAnchor.constraint(equalTo: checkboxContainerView.topAnchor, constant: 20).isActive = true - checkbox.trailingAnchor.constraint(equalTo: checkboxContainerView.trailingAnchor, constant: 10).isActive = true - view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) - setupPicker() + } + 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) + } + + @IBAction func disabledChanged(_ sender: UISwitch) { checkbox.disabled = sender.isOn } diff --git a/VDSSample/ViewControllers/RadioButtonViewController.swift b/VDSSample/ViewControllers/RadioButtonViewController.swift index 2eb4156..5d928d9 100644 --- a/VDSSample/ViewControllers/RadioButtonViewController.swift +++ b/VDSSample/ViewControllers/RadioButtonViewController.swift @@ -87,7 +87,7 @@ class RadioButtonViewController: UIViewController, StoryboardInitable { radioButtonGroup.createBinding(with: modelSubject, storeIn: &subscribers) //print out on subject changes - modelSubject.sink { [weak self] model in + modelSubject.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] model in self?.showErrorSwitch.isOn = model.hasError print("RadioButtonViewController hasError: \(model.hasError)")