From 2498a9f3aff76a43e01e127ac54588b2afd4d678 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 21 Jul 2023 14:55:37 -0500 Subject: [PATCH] added number publisher Signed-off-by: Matt Bruce --- VDSSample/Classes/Slider.swift | 20 +++--- VDSSample/Classes/TextField.swift | 13 ++++ .../BadgeIndicatorViewController.swift | 69 ++++++------------- .../ViewControllers/BadgeViewController.swift | 11 ++- .../ButtonGroupViewController.swift | 20 +++--- .../ButtonIconViewController.swift | 32 +++++---- .../ButtonViewController.swift | 9 ++- .../ViewControllers/IconViewController.swift | 12 ++-- .../InputFieldViewController.swift | 7 +- .../TabsContainerViewController.swift | 33 +++++---- .../TextAreaViewController.swift | 10 +-- .../TileContainerViewController.swift | 19 ++--- .../TileletViewController.swift | 45 +++++------- 13 files changed, 137 insertions(+), 163 deletions(-) diff --git a/VDSSample/Classes/Slider.swift b/VDSSample/Classes/Slider.swift index 76cba53..4dca0a0 100644 --- a/VDSSample/Classes/Slider.swift +++ b/VDSSample/Classes/Slider.swift @@ -9,7 +9,7 @@ import Foundation import UIKit import VDS -class Slider: Control, UITextFieldDelegate { +class Slider: Control { var textField = NumericField().with { $0.translatesAutoresizingMaskIntoConstraints = false } var range = UISlider().with { $0.translatesAutoresizingMaskIntoConstraints = false } var maximumValue: Float = 0.0 { didSet { range.maximumValue = maximumValue }} @@ -18,7 +18,6 @@ class Slider: Control, UITextFieldDelegate { override func setup() { addSubview(textField) addSubview(range) - textField.delegate = self textField.pinTop() textField.pinBottom() textField.pinLeading() @@ -33,6 +32,11 @@ class Slider: Control, UITextFieldDelegate { range.publisher(for: .valueChanged).sink { [weak self] slider in self?.valueChanged(newValue: slider.value) }.store(in: &subscribers) + + textField.numberPublisher.sink { [weak self] number in + guard let number else { return } + self?.valueChanged(newValue: number.floatValue) + }.store(in: &subscribers) } override func updateView() { @@ -43,12 +47,10 @@ class Slider: Control, UITextFieldDelegate { value = newValue sendActions(for: .valueChanged) } - - func textFieldShouldReturn(_ textField: UITextField) -> Bool { - textField.resignFirstResponder() - if let text = textField.text, let n = NumberFormatter().number(from: text) { - valueChanged(newValue: n.floatValue) - } - return true +} + +extension NSNumber { + public var cgFloatValue: CGFloat { + CGFloat(doubleValue) } } diff --git a/VDSSample/Classes/TextField.swift b/VDSSample/Classes/TextField.swift index 2cddac1..2105381 100644 --- a/VDSSample/Classes/TextField.swift +++ b/VDSSample/Classes/TextField.swift @@ -9,6 +9,7 @@ import Foundation import UIKit import VDS import VDSFormControlsTokens +import Combine public class TextField: UITextField { @@ -76,4 +77,16 @@ public class NumericField: TextField { super.setup() keyboardType = .numberPad } + + public var number: NSNumber? { + guard let text, let foundNumber = NumberFormatter().number(from: text) else { return nil } + return foundNumber + } + + public var numberPublisher: AnyPublisher { + publisher(for: .editingChanged) + .map { _ in self.number ?? nil } + .eraseToAnyPublisher() + } + } diff --git a/VDSSample/ViewControllers/BadgeIndicatorViewController.swift b/VDSSample/ViewControllers/BadgeIndicatorViewController.swift index e3a0cbf..7ea7979 100644 --- a/VDSSample/ViewControllers/BadgeIndicatorViewController.swift +++ b/VDSSample/ViewControllers/BadgeIndicatorViewController.swift @@ -50,7 +50,7 @@ class BadgeIndicatorViewController: BaseViewController { }() - var textField = TextField() + var textField = NumericField() var leadingCharacterTextField = TextField() var hideDotSwitch = Toggle() var hideBorderSwitch = Toggle() @@ -88,7 +88,7 @@ class BadgeIndicatorViewController: BaseViewController { dotForm.addFormRow(label: "Hide Dot", view: hideDotSwitch) dotForm.addFormRow(label: "Dot Size", view: dotSizeTextField) numberedForm.addFormRow(label: "Leading Character", view: leadingCharacterTextField) - numberedForm.addFormRow(label: "Text", view: textField) + numberedForm.addFormRow(label: "Number", view: textField) numberedForm.addFormRow(label: "Max Digits", view: maxDigitsPickerSelectorView) append(section: numberedForm) append(section: dotForm) @@ -102,71 +102,46 @@ class BadgeIndicatorViewController: BaseViewController { }.store(in: &subscribers) textField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.number = n.intValue - } + .numberPublisher + .sink { [weak self] number in + guard let number else { return } + self?.component.number = number.intValue }.store(in: &subscribers) leadingCharacterTextField .textPublisher .sink { [weak self] text in - if !text.isEmpty { - self?.component.leadingCharacter = text - } else { - self?.component.leadingCharacter = nil - } + self?.component.leadingCharacter = text }.store(in: &subscribers) heightTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.height = CGFloat(truncating: n) - } else { - self?.component.height = nil - } + .numberPublisher + .sink { [weak self] number in + self?.component.height = number?.cgFloatValue }.store(in: &subscribers) widthTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.width = CGFloat(truncating: n) - } else { - self?.component.width = nil - } + .numberPublisher + .sink { [weak self] number in + self?.component.width = number?.cgFloatValue }.store(in: &subscribers) horizontalPaddingTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.horitonalPadding = CGFloat(truncating: n) - } else { - self?.component.horitonalPadding = nil - } + .numberPublisher + .sink { [weak self] number in + self?.component.horitonalPadding = number?.cgFloatValue }.store(in: &subscribers) verticalPaddingTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.verticalPadding = CGFloat(truncating: n) - } else { - self?.component.verticalPadding = nil - } + .numberPublisher + .sink { [weak self] number in + self?.component.verticalPadding = number?.cgFloatValue }.store(in: &subscribers) dotSizeTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.dotSize = CGFloat(truncating: n) - } else { - self?.component.dotSize = nil - } + .numberPublisher + .sink { [weak self] number in + self?.component.dotSize = number?.cgFloatValue }.store(in: &subscribers) } diff --git a/VDSSample/ViewControllers/BadgeViewController.swift b/VDSSample/ViewControllers/BadgeViewController.swift index c81d6da..367c89b 100644 --- a/VDSSample/ViewControllers/BadgeViewController.swift +++ b/VDSSample/ViewControllers/BadgeViewController.swift @@ -74,13 +74,10 @@ class BadgeViewController: BaseViewController { }.store(in: &subscribers) maxWidthTextField - .textPublisher - .sink { [weak self] text in - var float: CGFloat? - if let n = NumberFormatter().number(from: text) { - float = CGFloat(truncating: n) - } - self?.component.maxWidth = float + .numberPublisher + .sink { [weak self] number in + guard let number else { return } + self?.component.maxWidth = number.cgFloatValue }.store(in: &subscribers) } diff --git a/VDSSample/ViewControllers/ButtonGroupViewController.swift b/VDSSample/ViewControllers/ButtonGroupViewController.swift index 35f2d39..4c4a271 100644 --- a/VDSSample/ViewControllers/ButtonGroupViewController.swift +++ b/VDSSample/ViewControllers/ButtonGroupViewController.swift @@ -124,11 +124,11 @@ class ButtonGroupViewController: BaseViewController { } widthTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.component.buttonWidth = CGFloat(truncating: n) - self?.smallButtonGroup.buttonWidth = CGFloat(truncating: n) + .numberPublisher + .sink { [weak self] number in + if let number { + self?.component.buttonWidth = number.cgFloatValue + self?.smallButtonGroup.buttonWidth = number.cgFloatValue self?.percentageTextField.text = "" } else { self?.component.buttonWidth = nil @@ -136,12 +136,12 @@ class ButtonGroupViewController: BaseViewController { }.store(in: &subscribers) percentageTextField - .textPublisher - .sink { [weak self] text in + .numberPublisher + .sink { [weak self] number in let rowQty = self?.component.rowQuantity ?? 0 - if let n = NumberFormatter().number(from: text), n.intValue <= 100, rowQty > 0 { - self?.component.buttonPercentage = CGFloat(truncating: n) - self?.smallButtonGroup.buttonPercentage = CGFloat(truncating: n) + if let number, number.intValue <= 100, rowQty > 0 { + self?.component.buttonPercentage = number.cgFloatValue + self?.smallButtonGroup.buttonPercentage = number.cgFloatValue self?.widthTextField.text = "" } else { self?.component.buttonPercentage = nil diff --git a/VDSSample/ViewControllers/ButtonIconViewController.swift b/VDSSample/ViewControllers/ButtonIconViewController.swift index 37c6d4c..eb8777f 100644 --- a/VDSSample/ViewControllers/ButtonIconViewController.swift +++ b/VDSSample/ViewControllers/ButtonIconViewController.swift @@ -92,22 +92,24 @@ class ButtonIconViewController: BaseViewController { fitToIcon.onChange = { [weak self] sender in self?.component.fitToIcon = sender.isOn } - - customSizeField.textPublisher.sink { [weak self] value in - if let intValue = Int(value) { - self?.component.customSize = intValue - } else if value.isEmpty { - self?.component.customSize = nil - } - }.store(in: &subscribers) - centerX.textPublisher.sink { [weak self] value in - self?.updateOffset() - }.store(in: &subscribers) - - centerY.textPublisher.sink { [weak self] value in - self?.updateOffset() - }.store(in: &subscribers) + customSizeField + .numberPublisher + .sink { [weak self] number in + self?.component.customSize = number?.intValue + }.store(in: &subscribers) + + centerX + .numberPublisher + .sink { [weak self] _ in + self?.updateOffset() + }.store(in: &subscribers) + + centerY + .numberPublisher + .sink { [weak self] _ in + self?.updateOffset() + }.store(in: &subscribers) } func setupModel() { diff --git a/VDSSample/ViewControllers/ButtonViewController.swift b/VDSSample/ViewControllers/ButtonViewController.swift index b8a99a1..47690c4 100644 --- a/VDSSample/ViewControllers/ButtonViewController.swift +++ b/VDSSample/ViewControllers/ButtonViewController.swift @@ -59,11 +59,10 @@ class ButtonViewController: BaseViewController