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
//--------------------------------------------------
// MARK: - Property Observer
// MARK: - Computed Properties
//--------------------------------------------------
public override var showError: Bool {

View File

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