vds_ios_sample/VDSSample/Classes/TextField.swift
Matt Bruce 2498a9f3af added number publisher
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2023-07-21 14:55:37 -05:00

93 lines
2.6 KiB
Swift

//
// TextField.swift
// VDSSample
//
// Created by Matt Bruce on 8/24/22.
//
import Foundation
import UIKit
import VDS
import VDSFormControlsTokens
import Combine
public class TextField: UITextField {
public var isNumeric: Bool = false
public var textPadding = UIEdgeInsets(
top: 10,
left: 10,
bottom: 10,
right: 10
)
public override init(frame: CGRect) {
super.init(frame: frame)
font = TextStyle.bodyLarge.font
setup()
}
public required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public func setup() {
let keypadToolbar: UIToolbar = UIToolbar()
// add a done button to the numberpad
keypadToolbar.items=[
UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil),
UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: self, action: #selector(UITextField.resignFirstResponder))
]
keypadToolbar.sizeToFit()
// add a toolbar with a done button above the number pad
inputAccessoryView = keypadToolbar
keyboardType = .alphabet
returnKeyType = .done
}
public override func textRect(forBounds bounds: CGRect) -> CGRect {
layer.borderColor = UIColor.black.cgColor
layer.borderWidth = VDSFormControls.widthBorder
let rect = super.textRect(forBounds: bounds)
return rect.inset(by: textPadding)
}
public override func editingRect(forBounds bounds: CGRect) -> CGRect {
layer.borderColor = UIColor.black.cgColor
layer.borderWidth = VDSFormControls.widthBorder
let rect = super.editingRect(forBounds: bounds)
return rect.inset(by: textPadding)
}
}
public class NumericField: TextField {
public override init(frame: CGRect) {
super.init(frame: frame)
isNumeric = true
}
public required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func setup() {
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<NSNumber?, Never> {
publisher(for: .editingChanged)
.map { _ in self.number ?? nil }
.eraseToAnyPublisher()
}
}