Bearbeiten/Aktualisierung: Xcode 11.4 • Swift 5.2
Bitte überprüfen Sie die Kommentare im Code
Dateiinhalt von IntegerField.swift:
import UIKit
class IntegerField: UITextField {
// gibt den Inhalt des Textfeldes zurück, entfernt nicht-numerische Zeichen und konvertiert das Ergebnis in einen Integer-Wert
var value: Int { string.digits.integer ?? 0 }
var maxValue: Int = 999_999_999
private var lastValue: Int = 0
override func willMove(toSuperview newSuperview: UIView?) {
// fügt dem Textfeld ein Ziel hinzu, um Änderungen im Text zu überwachen
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
// legt die Tastatur auf nur Zahlen
keyboardType = .numberPad
// legt die Textausrichtung auf rechts
textAlignment = .right
// sendet eine editingChanged-Aktion, um das Textfeld zur Aktualisierung zu zwingen
sendActions(for: .editingChanged)
}
// löscht die letzte Ziffer im Textfeld
override func deleteBackward() {
// beachten Sie, dass der Feld-Textwert standardmäßig ein leerer String ist, sodass das Entpacken seines Werts sicher ist
// beachten Sie auch, dass collection remove at eine nicht leere Collection erfordert, was in diesem Fall ebenfalls zutrifft, sodass keine Prüfung erforderlich ist, ob die Collection nicht leer ist.
text!.remove(at: text!.index(before: text!.endIndex))
// sendet eine editingChanged-Aktion, um das Textfeld zur Aktualisierung zu zwingen
sendActions(for: .editingChanged)
}
@objc func editingChanged() {
guard value <= maxValue else {
text = Formatter.decimal.string(for: lastValue)
return
}
// Dadurch wird das Textfeld entsprechend der gerätespezifischen Lokalisierung und Einstellungen formatiert
text = Formatter.decimal.string(for: value)
print("Wert:", value)
lastValue = value
}
}
Sie müssen auch diese Erweiterungen zu Ihrem Projekt hinzufügen:
Dateiinhalt von Extensions UITextField.swift:
import UIKit
extension UITextField {
var string: String { text ?? "" }
}
Dateiinhalt von Extensions Formatter.swift:
import Foundation
extension Formatter {
static let decimal = NumberFormatter(numberStyle: .decimal)
}
Dateiinhalt von Extensions NumberFormatter.swift:
import Foundation
extension NumberFormatter {
convenience init(numberStyle: Style) {
self.init()
self.numberStyle = numberStyle
}
}
Dateiinhalt von Extensions StringProtocol.swift:
extension StringProtocol where Self: RangeReplaceableCollection {
var digits: Self { filter(\.isWholeNumber) }
var integer: Int? { Int(self) }
}
Beispielprojekt