diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 9745d71..8de2f8f 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -40,6 +40,7 @@ EA3C3BB528996775000CA526 /* StoryboardInitable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3C3BB128996775000CA526 /* StoryboardInitable.swift */; }; 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 */; }; 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 */; }; @@ -93,6 +94,7 @@ EA3C3BBA289968A0000CA526 /* VDSTypographyTokens.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = VDSTypographyTokens.xcframework; path = ../SharedFrameworks/VDSTypographyTokens.xcframework; sourceTree = ""; }; 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 = ""; }; 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 = ""; }; @@ -204,6 +206,7 @@ isa = PBXGroup; children = ( EAF7F09B2899B92400B287F5 /* CheckboxViewController.swift */, + EA89200928B52934006B9984 /* CheckboxGroupViewController.swift */, EA3C3BB228996775000CA526 /* MenuViewController.swift */, EAF7F11928A14A0E00B287F5 /* RadioButtonViewController.swift */, EA3C3BB328996775000CA526 /* ToggleViewController.swift */, @@ -365,6 +368,7 @@ EA3C3BB428996775000CA526 /* PickerBase.swift in Sources */, EAB1D2C528A6B11D00DAE764 /* TestViewController.swift in Sources */, EAB1D2C928AAAA1D00DAE764 /* ModelViewController.swift in Sources */, + EA89200A28B52934006B9984 /* CheckboxGroupViewController.swift in Sources */, EAF7F09C2899B92400B287F5 /* CheckboxViewController.swift in Sources */, EAB1D2D428AC409F00DAE764 /* LabelViewController.swift in Sources */, ); diff --git a/VDSSample/Supporting Files/Resources/Components.storyboard b/VDSSample/Supporting Files/Resources/Components.storyboard index 9af4965..db71954 100644 --- a/VDSSample/Supporting Files/Resources/Components.storyboard +++ b/VDSSample/Supporting Files/Resources/Components.storyboard @@ -1,9 +1,9 @@ - + - + @@ -18,14 +18,14 @@ - + - + @@ -273,14 +273,14 @@ - + - + @@ -461,14 +461,14 @@ - + - + @@ -629,14 +629,14 @@ - + - + @@ -836,6 +836,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VDSSample/ViewControllers/CheckboxGroupViewController.swift b/VDSSample/ViewControllers/CheckboxGroupViewController.swift new file mode 100644 index 0000000..288b670 --- /dev/null +++ b/VDSSample/ViewControllers/CheckboxGroupViewController.swift @@ -0,0 +1,134 @@ +// +// CheckboxViewController.swift +// VDSSample +// +// Created by Matt Bruce on 8/1/22. +// + +import Foundation +import UIKit +import VDS +import VDSColorTokens +import Combine + +class CheckboxGroupViewController: ModelViewController, StoryboardInitable { + + enum PickerType { + case surface + } + static var storyboardId: String = "checkboxGroup" + 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! + @IBOutlet weak var showErrorSwitch: UISwitch! + + var checkboxGroup = CheckboxGroup() + + override func viewDidLoad() { + super.viewDidLoad() + checkboxContainerView.addSubview(checkboxGroup) + checkboxGroup.leadingAnchor.constraint(equalTo: checkboxContainerView.leadingAnchor, constant: 10).isActive = true + checkboxGroup.bottomAnchor.constraint(equalTo: checkboxContainerView.bottomAnchor, constant: -20).isActive = true + checkboxGroup.topAnchor.constraint(equalTo: checkboxContainerView.topAnchor, constant: 20).isActive = true + checkboxGroup.trailingAnchor.constraint(equalTo: checkboxContainerView.trailingAnchor, constant: 10).isActive = true + view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) + setupPicker() + setupModel() + } + + func setupModel() { + var defaultModel = DefaultCheckboxGroupModel() + var model1 = DefaultCheckboxModel() + model1.value = "model 1 Value" + model1.labelText = "iPhone 11 Bundle 1" + model1.childText = "Apple iPhone 11 - 64 GB\nOtterbox Case Red\nScreen Protector" + + var model2 = DefaultCheckboxModel() + model2.value = "model 2 Value" + model2.labelText = "iPhone 11 Bundle 2" + model2.childText = "Apple iPhone 11 - 128 GB\nOtterbox Case Black\nScreen Protector" + defaultModel.selectors = [model1, model2] + set(with: defaultModel) + + checkboxGroup + .handlerPublisher() + .sink { [weak self] viewModel in + self?.model = viewModel + }.store(in: &subscribers) + + //setup UI + surfaceLabel.text = model.surface.rawValue + disabledSwitch.isOn = model.disabled + labelTextField.text = model2.labelText + childTextField.text = model1.childText + showErrorSwitch.isOn = model.hasError + + } + + override func updateView(viewModel: DefaultCheckboxGroupModel) { + print("\(Self.self) updateView(viewModel)") + checkboxGroup.set(with: viewModel) + } + + var checkbox: Checkbox? { + checkboxGroup.selectorViews.first + } + + @IBAction func disabledChanged(_ sender: UISwitch) { + checkboxGroup.disabled = sender.isOn + } + + @IBAction func onLabelTextDidEnd(_ sender: UITextField) { + checkbox?.labelText = sender.text + sender.resignFirstResponder() + } + + @IBAction func onChildTextDidEnd(_ sender: UITextField) { + checkbox?.childText = sender.text + sender.resignFirstResponder() + } + + @IBAction func showErrorChanged(_ sender: UISwitch) { + checkboxGroup.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?.checkboxGroup.surface = item + self?.checkboxContainerView.backgroundColor = item.color + self?.surfaceLabel.text = item.rawValue + } + } +} + diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index fc645b1..c1da167 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -22,6 +22,7 @@ class MenuViewController: UITableViewController { MenuComponent(title: "Label", viewController: LabelViewController.self), MenuComponent(title: "Toggle", viewController: ToggleViewController.self), MenuComponent(title: "Checkbox", viewController: CheckboxViewController.self), + MenuComponent(title: "CheckboxGroup", viewController: CheckboxGroupViewController.self), MenuComponent(title: "RadioButton", viewController: RadioButtonViewController.self), MenuComponent(title: "Test Form", viewController: TestViewController.self), MenuComponent(title: "Template", viewController: TemplateViewController.self)