diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 8de2f8f..efac15b 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -41,6 +41,7 @@ EA3C3BB628996775000CA526 /* MenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3C3BB228996775000CA526 /* MenuViewController.swift */; }; EA3C3BB728996775000CA526 /* ToggleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3C3BB328996775000CA526 /* ToggleViewController.swift */; }; EA89200A28B52934006B9984 /* CheckboxGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200928B52934006B9984 /* CheckboxGroupViewController.swift */; }; + EA89201928B56DF5006B9984 /* RadioBoxGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */; }; EAB1D2C528A6B11D00DAE764 /* TestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2C428A6B11D00DAE764 /* TestViewController.swift */; }; EAB1D2C928AAAA1D00DAE764 /* ModelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2C828AAAA1D00DAE764 /* ModelViewController.swift */; }; EAB1D2CB28AAB9E200DAE764 /* TemplateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CA28AAB9E200DAE764 /* TemplateViewController.swift */; }; @@ -95,6 +96,7 @@ EA3C3BBB289968A0000CA526 /* VDSFormControlsTokens.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = VDSFormControlsTokens.xcframework; path = ../SharedFrameworks/VDSFormControlsTokens.xcframework; sourceTree = ""; }; EA3C3BC3289968B1000CA526 /* VDS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = VDS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EA89200928B52934006B9984 /* CheckboxGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxGroupViewController.swift; sourceTree = ""; }; + EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioBoxGroupViewController.swift; sourceTree = ""; }; EAB1D2C428A6B11D00DAE764 /* TestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestViewController.swift; sourceTree = ""; }; EAB1D2C828AAAA1D00DAE764 /* ModelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelViewController.swift; sourceTree = ""; }; EAB1D2CA28AAB9E200DAE764 /* TemplateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateViewController.swift; sourceTree = ""; }; @@ -205,15 +207,16 @@ EAF7F07F28996A1900B287F5 /* ViewControllers */ = { isa = PBXGroup; children = ( - EAF7F09B2899B92400B287F5 /* CheckboxViewController.swift */, - EA89200928B52934006B9984 /* CheckboxGroupViewController.swift */, EA3C3BB228996775000CA526 /* MenuViewController.swift */, - EAF7F11928A14A0E00B287F5 /* RadioButtonViewController.swift */, - EA3C3BB328996775000CA526 /* ToggleViewController.swift */, - EAB1D2C428A6B11D00DAE764 /* TestViewController.swift */, - EAB1D2C828AAAA1D00DAE764 /* ModelViewController.swift */, - EAB1D2CA28AAB9E200DAE764 /* TemplateViewController.swift */, + EA89200928B52934006B9984 /* CheckboxGroupViewController.swift */, + EAF7F09B2899B92400B287F5 /* CheckboxViewController.swift */, EAB1D2D328AC409F00DAE764 /* LabelViewController.swift */, + EAB1D2C828AAAA1D00DAE764 /* ModelViewController.swift */, + EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */, + EAF7F11928A14A0E00B287F5 /* RadioButtonViewController.swift */, + EAB1D2CA28AAB9E200DAE764 /* TemplateViewController.swift */, + EAB1D2C428A6B11D00DAE764 /* TestViewController.swift */, + EA3C3BB328996775000CA526 /* ToggleViewController.swift */, ); path = ViewControllers; sourceTree = ""; @@ -360,6 +363,7 @@ files = ( EA3C3BB728996775000CA526 /* ToggleViewController.swift in Sources */, EA3C3BB528996775000CA526 /* StoryboardInitable.swift in Sources */, + EA89201928B56DF5006B9984 /* RadioBoxGroupViewController.swift in Sources */, EA3C3BB628996775000CA526 /* MenuViewController.swift in Sources */, EA3C3B9D289966EF000CA526 /* AppDelegate.swift in Sources */, EAF7F11A28A14A0E00B287F5 /* RadioButtonViewController.swift in Sources */, diff --git a/VDSSample/Supporting Files/Resources/Components.storyboard b/VDSSample/Supporting Files/Resources/Components.storyboard index db71954..56f737e 100644 --- a/VDSSample/Supporting Files/Resources/Components.storyboard +++ b/VDSSample/Supporting Files/Resources/Components.storyboard @@ -1004,6 +1004,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index c1da167..16d86aa 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -24,6 +24,7 @@ class MenuViewController: UITableViewController { MenuComponent(title: "Checkbox", viewController: CheckboxViewController.self), MenuComponent(title: "CheckboxGroup", viewController: CheckboxGroupViewController.self), MenuComponent(title: "RadioButton", viewController: RadioButtonViewController.self), + MenuComponent(title: "RadioBoxGroup", viewController: RadioBoxGroupViewController.self), MenuComponent(title: "Test Form", viewController: TestViewController.self), MenuComponent(title: "Template", viewController: TemplateViewController.self) ] diff --git a/VDSSample/ViewControllers/RadioBoxGroupViewController.swift b/VDSSample/ViewControllers/RadioBoxGroupViewController.swift new file mode 100644 index 0000000..bf86d2b --- /dev/null +++ b/VDSSample/ViewControllers/RadioBoxGroupViewController.swift @@ -0,0 +1,150 @@ +// +// RadioBoxGroupViewController.swift +// VDSSample +// +// Created by Matt Bruce on 8/23/22. +// + +import Foundation +import UIKit +import VDS +import VDSColorTokens +import Combine + +class RadioBoxGroupViewController: ModelViewController, StoryboardInitable { + deinit { + print("\(Self.self) deinit") + } + + enum PickerType { + case surface + } + static var storyboardId: String = "radioBoxGroup" + static var storyboardName: String = "Components" + + @IBOutlet weak var componentContainerView: UIView! + @IBOutlet weak var disabledSwitch: UISwitch! + @IBOutlet weak var picker: UIPickerView! + @IBOutlet weak var surfaceLabel: UILabel! + @IBOutlet weak var textField: UITextField! + @IBOutlet weak var subTextField: UITextField! + @IBOutlet weak var subTextRightField: UITextField! + @IBOutlet weak var showErrorSwitch: UISwitch! + + var radioBoxGroup = RadioBoxGroup() + + override func viewDidLoad() { + super.viewDidLoad() + view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) + + componentContainerView.addSubview(radioBoxGroup) + radioBoxGroup.leadingAnchor.constraint(equalTo: componentContainerView.leadingAnchor, constant: 10).isActive = true + radioBoxGroup.topAnchor.constraint(equalTo: componentContainerView.topAnchor, constant: 20).isActive = true + radioBoxGroup.bottomAnchor.constraint(equalTo: componentContainerView.bottomAnchor, constant: -20).isActive = true + radioBoxGroup.trailingAnchor.constraint(equalTo: componentContainerView.trailingAnchor, constant: 10).isActive = true + setupPicker() + setupModel() + } + + func setupModel(){ + var defaultModel = DefaultRadioBoxGroupModel() + var model1 = DefaultRadioBoxModel() + model1.value = "model 1 Value" + model1.text = "iPhone 11 Bundle 1" + model1.subText = "Apple iPhone 11 - 64 GB\nOtterbox Case Red\nScreen Protector" + model1.subTextRight = "Right Text" + + var model2 = DefaultRadioBoxModel() + model2.strikethrough = true + model2.value = "model 2 Value" + model2.text = "iPhone 11 Bundle 2" + model2.subText = "Apple iPhone 11 - 128 GB\nOtterbox Case Black\nScreen Protector" + + defaultModel.selectors = [model1, model2] + set(with: defaultModel) + + //update the model + radioBoxGroup + .handlerPublisher() + .sink { [weak self] updatedModel in + self?.model = updatedModel + self?.showErrorSwitch.isOn = updatedModel.hasError + self?.disabledSwitch.isOn = updatedModel.disabled + } + .store(in: &subscribers) + + //set UI values + surfaceLabel.text = model.surface.rawValue + disabledSwitch.isOn = model.disabled + showErrorSwitch.isOn = model.hasError + textField.text = model1.text + subTextField.text = model1.subText + subTextRightField.text = model1.subTextRight + } + + override func updateView(viewModel: ModelType) { + print("\(Self.self) updateView(viewModel)") + showErrorSwitch.isOn = viewModel.hasError + disabledSwitch.isOn = viewModel.disabled + radioBoxGroup.set(with: viewModel) + } + + var radioBox: RadioBox? { + radioBoxGroup.selectorViews.first + } + @IBAction func disabledChanged(_ sender: UISwitch) { + radioBoxGroup.disabled = sender.isOn + } + + @IBAction func onTextDidEnd(_ sender: UITextField) { + radioBox?.text = sender.text ?? "No value entered" + sender.resignFirstResponder() + } + + @IBAction func onSubTextDidEnd(_ sender: UITextField) { + radioBox?.subText = sender.text + sender.resignFirstResponder() + } + + @IBAction func onSubTextRightDidEnd(_ sender: UITextField) { + radioBox?.subTextRight = sender.text + sender.resignFirstResponder() + } + + @IBAction func showErrorChanged(_ sender: UISwitch) { + radioBoxGroup.hasError = sender.isOn + } + + @IBAction func surfaceClick(_ sender: Any) { + pickerType = .surface + } + + //Picker + var surfacePicker = SurfacePicker() + + var pickerType: PickerType = .surface { + didSet { + func update(object: UIPickerViewDelegate & UIPickerViewDataSource){ + picker.delegate = object + picker.dataSource = object + } + + switch pickerType{ + case .surface: + update(object: surfacePicker) + } + picker.reloadAllComponents() + picker.selectRow(0, inComponent: 0, animated: false) + picker.isHidden = false + } + } + + func setupPicker(){ + picker.isHidden = true + surfacePicker.onPickerDidSelect = { [weak self] item in + self?.radioBoxGroup.surface = item + self?.componentContainerView.backgroundColor = item.color + self?.surfaceLabel.text = item.rawValue + } + } +}