// // RadioButtonGroup.swift // VDS // // Created by Matt Bruce on 8/11/22. // import Foundation import UIKit public class RadioButtonGroup: RadioButtonGroupBase { public override func didSelect(_ selectedControl: RadioButton) { let oldSelectedControl = selectorViews.filter { $0.isSelected == true }.first oldSelectedControl?.toggle() selectedControl.toggle() if hasError { hasError = false } valueChanged() } } public class RadioButtonGroupBase>: SelectorGroupSelectedHandlerBase { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- public var hasError: Bool { get { model.hasError } set { var newHasError = newValue if selectedModel != nil, newHasError { newHasError = false } selectorViews.forEach { handler in handler.hasError = newHasError } model.hasError = newHasError } } //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- private var mainStackView: UIStackView = { return UIStackView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.alignment = .fill $0.distribution = .fillProportionally $0.axis = .vertical $0.spacing = 10 } }() //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- open override func setup() { super.setup() isAccessibilityElement = true accessibilityTraits = .button addSubview(mainStackView) mainStackView.topAnchor.constraint(equalTo: topAnchor).isActive = true mainStackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true } open override func shouldUpdateView(viewModel: ModelType) -> Bool { let update = viewModel.selectedModel?.inputId != model.selectedModel?.inputId || viewModel.selectors.count != model.selectors.count || viewModel.hasError != model.hasError || viewModel.surface != model.surface || viewModel.disabled != model.disabled return update } open override func updateView(viewModel: ModelType) { for selectorModel in viewModel.selectors { //see if view is there for the model if let foundSelectorView = findSelectorView(id: selectorModel.id) { foundSelectorView.set(with: selectorModel) } else { //create view let newSelectorView = createModelHandler(selector: selectorModel) self.selectorViews.append(newSelectorView) mainStackView.addArrangedSubview(newSelectorView) } } } public var selectedModelHandler: ModelHandlerType? { if let index = selectorViews.firstIndex(where: { element in return element.isSelected == true }) { return selectorViews[index] } else { return nil } } }