This commit is contained in:
Kevin G Christiano 2019-11-21 16:40:34 -05:00
parent 8b5fe4a1f4
commit 64bda3cb1d
2 changed files with 56 additions and 53 deletions

View File

@ -35,7 +35,7 @@ import UIKit
private var previousSize: CGFloat = 0.0 private var previousSize: CGFloat = 0.0
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Property Observer // MARK: - Computed Properties
//-------------------------------------------------- //--------------------------------------------------
public override var showError: Bool { public override var showError: Bool {

View File

@ -13,36 +13,35 @@ import UIKit
*/ */
@objcMembers open class DigitEntryField: TextEntryField, DigitBoxProtocol { @objcMembers open class DigitEntryField: TextEntryField, DigitBoxProtocol {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Properties // MARK: - Stored Properties
//-------------------------------------------------- //--------------------------------------------------
private(set) var numberOfDigits = 4 private(set) var numberOfDigits = 4
public var switchFieldsAutomatically = false
/// Monitors if fields are being selected internally.
private var switchFieldsAutomatically = false
public var digitBoxes: [DigitBox] = [] public var digitBoxes: [DigitBox] = []
var selectedDigitField: DigitBox? var selectedDigitField: DigitBox?
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Property Observers // MARK: - Computed Properties
//-------------------------------------------------- //--------------------------------------------------
public override var isEnabled: Bool { public override var isEnabled: Bool {
get { return super.isEnabled } get { return super.isEnabled }
set (enabled) { set (enabled) {
titleLabel.textColor = enabled ? .mfBattleshipGrey() : .mfSilver() titleLabel.textColor = enabled ? .mfBattleshipGrey() : .mfSilver()
digitBoxes.forEach { $0.isEnabled = enabled }
digitBoxes.forEach { super.isEnabled = enabled
$0.isEnabled = enabled
$0.isUserInteractionEnabled = enabled
$0.digitField.isEnabled = enabled
$0.digitField.textColor = enabled ? .black : .mfBattleshipGrey()
}
} }
} }
public override var showError: Bool { public override var showError: Bool {
didSet { get { return super.showError }
digitBoxes.forEach { $0.showError = self.showError } set (error) {
digitBoxes.forEach { $0.showError = error }
super.showError = error
} }
} }
@ -50,6 +49,7 @@ import UIKit
get { return super.isLocked } get { return super.isLocked }
set (locked) { set (locked) {
digitBoxes.forEach { $0.isLocked = locked } digitBoxes.forEach { $0.isLocked = locked }
super.isLocked = locked
} }
} }
@ -109,6 +109,13 @@ import UIKit
} }
} }
//--------------------------------------------------
// MARK: - Delegate
//--------------------------------------------------
/// Holds a reference to the 'delegating' class so this class can internally influence the TextField behavior as well.
private weak var proprietorTextDelegate: UITextFieldDelegate?
/// If you're using a MFViewController, you must set this to it /// If you're using a MFViewController, you must set this to it
public override weak var uiTextFieldDelegate: UITextFieldDelegate? { public override weak var uiTextFieldDelegate: UITextFieldDelegate? {
get { return textField.delegate } get { return textField.delegate }
@ -118,19 +125,15 @@ import UIKit
} }
} }
//--------------------------------------------------
// MARK: - Delegate
//--------------------------------------------------
/// Holds a reference to the 'delegating' class so this class can internally influence the TextField behavior as well.
private weak var proprietorTextDelegate: UITextFieldDelegate?
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
//-------------------------------------------------- //--------------------------------------------------
@objc public override init(frame: CGRect) { @objc public override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
isAccessibilityElement = false
entryContainer.disableAllBorders = true
} }
@objc public convenience init() { @objc public convenience init() {
@ -152,12 +155,7 @@ import UIKit
// MARK: - Setup // MARK: - Setup
//-------------------------------------------------- //--------------------------------------------------
@objc public override func setupFieldContainerContent(_ container: UIView) { @objc public override func setupFieldContainerContent(_ container: UIView) {}
alignCenterHorizontal()
isAccessibilityElement = false
entryContainer.disableAllBorders = true
}
@objc private func createDigitField() -> DigitBox { @objc private func createDigitField() -> DigitBox {
@ -173,10 +171,11 @@ import UIKit
var accessibleElements: [Any] = [titleLabel] var accessibleElements: [Any] = [titleLabel]
digitBoxes.forEach { $0.removeFromSuperview() } resetDigitBoxes()
if numberOfDigits > 0 { if numberOfDigits > 0 {
var digitBoxes = [DigitBox]() var digitBoxes = [DigitBox]()
for _ in 0..<numberOfDigits { for _ in 0..<numberOfDigits {
digitBoxes.append(createDigitField()) digitBoxes.append(createDigitField())
} }
@ -206,8 +205,6 @@ import UIKit
prevBox = box prevBox = box
} }
} else {
digitBoxes = []
} }
accessibilityElements = accessibleElements + [feedbackLabel] accessibilityElements = accessibleElements + [feedbackLabel]
@ -236,7 +233,13 @@ import UIKit
@objc open override func reset() { @objc open override func reset() {
super.reset() super.reset()
resetDigitBoxes()
}
func resetDigitBoxes() {
digitBoxes.forEach { $0.reset() } digitBoxes.forEach { $0.reset() }
digitBoxes = []
} }
//-------------------------------------------------- //--------------------------------------------------
@ -270,20 +273,22 @@ import UIKit
var selectPreviousField = false var selectPreviousField = false
for field in Array(digitBoxes.reversed()) { for (index, field) in Array(digitBoxes.reversed()).enumerated() {
if field.isSelected { if field.digitField == currentTextField {
selectPreviousField = true
field.isSelected = false field.isSelected = false
if index == digitBoxes.count - 1 {
return
} else {
selectPreviousField = true
}
} else if selectPreviousField { } else if selectPreviousField {
if !clear { if !clear {
switchFieldsAutomatically = true self.switchFieldsAutomatically = true
} }
field.digitField.becomeFirstResponder() field.digitField.becomeFirstResponder()
self.switchFieldsAutomatically = false
field.isSelected = true field.isSelected = true
switchFieldsAutomatically = false
UIAccessibility.post(notification: .layoutChanged, argument: field.digitField) UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
return return
} }
@ -295,8 +300,8 @@ import UIKit
var selectNextField = false var selectNextField = false
for (index, field) in digitBoxes.enumerated() { for (index, field) in digitBoxes.enumerated() {
if field.isSelected { if field.digitField == currentTextField {
if index == digitBoxes.count - 1 { if index == digitBoxes.count - 1 {
return return
} else { } else {
@ -306,18 +311,17 @@ import UIKit
} else if selectNextField { } else if selectNextField {
if !clear { if !clear {
switchFieldsAutomatically = true self.switchFieldsAutomatically = true
} }
field.digitField.becomeFirstResponder() field.digitField.becomeFirstResponder()
self.switchFieldsAutomatically = false
field.isSelected = true field.isSelected = true
switchFieldsAutomatically = false
UIAccessibility.post(notification: .layoutChanged, argument: field.digitField) UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
return return
} }
} }
} }
@objc override func startEditing() { @objc override func startEditing() {
selectedDigitField?.isSelected = true selectedDigitField?.isSelected = true
@ -333,10 +337,10 @@ import UIKit
@objc override func dismissFieldInput(_ sender: Any?) { @objc override func dismissFieldInput(_ sender: Any?) {
for box in digitBoxes { digitBoxes.forEach {
if box.isSelected { if $0.isSelected {
box.digitField.resignFirstResponder() $0.digitField.resignFirstResponder()
box.isSelected = false $0.isSelected = false
} }
} }
} }
@ -394,12 +398,16 @@ extension DigitEntryField {
@objc func digitFieldDidDelete(_ textField: UITextField?) { @objc func digitFieldDidDelete(_ textField: UITextField?) {
// Empty cell, go back to previous cell and clear.
selectPreviousDigitField(textField, clear: true) selectPreviousDigitField(textField, clear: true)
} }
@objc public func textFieldDidBeginEditing(_ textField: UITextField) { @objc public func textFieldDidBeginEditing(_ textField: UITextField) {
if !switchFieldsAutomatically {
textField.text = ""
valueChanged()
}
for digitBox in digitBoxes { for digitBox in digitBoxes {
if digitBox.isSelected { if digitBox.isSelected {
@ -413,11 +421,6 @@ extension DigitEntryField {
} }
} }
// if !switchFieldsAutomatically {
// textField.text = ""
// valueChanged()
// }
proprietorTextDelegate?.textFieldDidBeginEditing?(textField) proprietorTextDelegate?.textFieldDidBeginEditing?(textField)
} }
@ -426,7 +429,7 @@ extension DigitEntryField {
digitBoxes.forEach { box in digitBoxes.forEach { box in
if box.digitField == textField { if box.digitField == textField {
box.isSelected = false box.isSelected = false
break return
} }
} }