continues development

This commit is contained in:
Kevin G Christiano 2021-02-11 16:09:38 -05:00
parent 63cf1c994a
commit 3efe4ae81f
6 changed files with 59 additions and 63 deletions

View File

@ -87,7 +87,7 @@ import UIKit
dropDownCaretView.setOptional(with: model.caretView, delegateObject, additionalData)
}
public override func dismissFieldInput(_ sender: Any?) {
@objc public override func dismissFieldInput(_ sender: Any?) {
performDropdownAction()
super.dismissFieldInput(sender)
}

View File

@ -8,7 +8,10 @@
import UIKit
open class BaseItemPickerEntryField: BaseDropdownEntryField {
public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource)
open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegate, UIPickerViewDataSource {
//--------------------------------------------------
// MARK: - Outlets
//--------------------------------------------------
@ -27,4 +30,31 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField {
/// When selecting for first responder, allow initial selected value to appear in empty text field.
public var setInitialValueInTextField = true
//--------------------------------------------------
// MARK: - Methods
//--------------------------------------------------
@objc open override func setupFieldContainerContent(_ container: UIView) {
super.setupFieldContainerContent(container)
pickerView = UIPickerView.addPicker(to: self.textField, delegate: self, dismissAction: #selector(dismissFieldInput))
textField.hideBlinkingCaret = true
textField.autocorrectionType = .no
uiTextFieldDelegate = self
}
@objc public func setPickerDelegates(delegate: UIPickerViewDelegate & UIPickerViewDataSource) {
pickerView?.delegate = delegate
pickerView?.dataSource = delegate
}
//--------------------------------------------------
// MARK: - Picker Delegate to Override
//--------------------------------------------------
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 0 }
public func numberOfComponents(in pickerView: UIPickerView) -> Int { 0 }
}

View File

@ -8,25 +8,13 @@
import UIKit
public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource)
open class ItemDropdownEntryField: BaseDropdownEntryField {
open class ItemDropdownEntryField: BaseItemPickerEntryField {
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
open var pickerData: [String] = []
open var pickerView: UIPickerView?
/// When selecting for first responder, allow initial selected value to appear in empty text field.
public var setInitialValueInTextField = true
/// Closure passed here will run as picker changes items.
public var observeDropdownChange: ((String, String)->())?
/// Closure passed here will run upon dismissing the selection picker.
public var observeDropdownSelection: ((String)->())?
public var itemDropdownEntryFieldModel: ItemDropdownEntryFieldModel? {
model as? ItemDropdownEntryFieldModel
@ -61,21 +49,6 @@ open class ItemDropdownEntryField: BaseDropdownEntryField {
// MARK: - Methods
//--------------------------------------------------
@objc open override func setupFieldContainerContent(_ container: UIView) {
super.setupFieldContainerContent(container)
pickerView = UIPickerView.addPicker(to: textField, delegate: self, dismissAction: #selector(dismissFieldInput))
textField.hideBlinkingCaret = true
textField.autocorrectionType = .no
uiTextFieldDelegate = self
}
@objc public func setPickerDelegates(delegate: UIPickerViewDelegate & UIPickerViewDataSource) {
pickerView?.delegate = delegate
pickerView?.dataSource = delegate
}
/// Sets the textField with the first value of the available picker data.
@objc private func setInitialValueFromPicker() {
@ -116,14 +89,14 @@ open class ItemDropdownEntryField: BaseDropdownEntryField {
self.pickerView(pickerView, didSelectRow: index, inComponent: 0)
}
}
}
// MARK:- Base Picker Delegate
extension ItemDropdownEntryField: UIPickerViewDelegate, UIPickerViewDataSource {
//--------------------------------------------------
// MARK: - Picker Delegate
//--------------------------------------------------
@objc public func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 }
@objc public override func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 }
@objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
@objc public override func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
pickerData.count
}

View File

@ -52,21 +52,6 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField {
// MARK: - Methods
//--------------------------------------------------
@objc open override func setupFieldContainerContent(_ container: UIView) {
super.setupFieldContainerContent(container)
pickerView = UIPickerView.addPicker(to: textField, delegate: self, dismissAction: #selector(dismissFieldInput))
textField.hideBlinkingCaret = true
textField.autocorrectionType = .no
uiTextFieldDelegate = self
}
@objc public func setPickerDelegates(delegate: UIPickerViewDelegate & UIPickerViewDataSource) {
pickerView?.delegate = delegate
pickerView?.dataSource = delegate
}
/// Sets the textField with the first value of the available picker data.
@objc private func setInitialValueFromPicker() {
@ -75,7 +60,7 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField {
let rowText = dropdownModel?.selectedRowText
else { return }
// observeDropdownChange?(text ?? "", rowText)
observeDropdownChange?(text ?? "", rowText)
text = rowText
for component in 0..<componentCount {
@ -103,7 +88,7 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField {
let rowText = dropdownModel?.selectedRowText
else { return }
// observeDropdownSelection?(rowText)
observeDropdownSelection?(rowText)
}
//--------------------------------------------------
@ -123,14 +108,14 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField {
}
}
}
}
// MARK:- Picker Delegate
extension MultiItemDropdownEntryField: UIPickerViewDelegate, UIPickerViewDataSource {
//--------------------------------------------------
// MARK: - Picker Delegate
//--------------------------------------------------
@objc public func numberOfComponents(in pickerView: UIPickerView) -> Int { componentCount }
@objc public override func numberOfComponents(in pickerView: UIPickerView) -> Int { componentCount }
@objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
@objc public override func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
pickerComponents[component].count
}
@ -150,7 +135,7 @@ extension MultiItemDropdownEntryField: UIPickerViewDelegate, UIPickerViewDataSou
let rowText = dropdownModel?.selectedRowText
else { return }
// observeDropdownChange?(text ?? "", rowText)
observeDropdownChange?(text ?? "", rowText)
text = rowText
dropdownModel?.selectedIndexes[component] = row
}

View File

@ -18,6 +18,7 @@ import Foundation
public var components: [[String]] = [[]]
public var selectedIndexes: [Int: Int] = [:]
public var delimiters: [String]?
//--------------------------------------------------
// MARK: - Validation
@ -37,6 +38,12 @@ import Foundation
for i in 0..<components.count {
let pickerIndex = selectedIndexes[i] ?? 0
if i < components.count, let delimiters = delimiters {
text += components[i][pickerIndex] + delimiters[pickerIndex]
} else {
}
text += components[i][pickerIndex] + (i == components.count - 1 ? "" : " ")
}
@ -61,8 +68,8 @@ import Foundation
private enum CodingKeys: String, CodingKey {
case components
case selectedIndex // Deprecated: for backwards compatability
case selectedIndexes
case delimiters
}
//--------------------------------------------------
@ -74,9 +81,10 @@ import Foundation
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
components = try typeContainer.decode([[String]].self, forKey: .components)
delimiters = try typeContainer.decodeIfPresent([String].self, forKey: .delimiters)
if let indicies = try typeContainer.decodeIfPresent([Int].self, forKey: .selectedIndexes) {
for (component, index) in indicies.enumerated() {
if let indexes = try typeContainer.decodeIfPresent([Int].self, forKey: .selectedIndexes) {
for (component, index) in indexes.enumerated() {
self.selectedIndexes[component] = index
}
@ -89,5 +97,6 @@ import Foundation
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(components, forKey: .components)
try container.encode(selectedIndexesArray, forKey: .selectedIndexes)
try container.encodeIfPresent(delimiters, forKey: .delimiters)
}
}

View File

@ -7,10 +7,9 @@
//
// Form fields are items can be interacted with. They have value, and may need to be validated.
import Foundation
public protocol FormFieldProtocol: FormItemProtocol {
/// How the validator identifies the field when validating rules.
var fieldKey: String? { get set }