wip.
This commit is contained in:
parent
8b5fe4a1f4
commit
64bda3cb1d
@ -35,7 +35,7 @@ import UIKit
|
||||
private var previousSize: CGFloat = 0.0
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Property Observer
|
||||
// MARK: - Computed Properties
|
||||
//--------------------------------------------------
|
||||
|
||||
public override var showError: Bool {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user