Ich bin neu in SwiftUI und iOS und versuche, ein Eingabefeld zu erstellen, das nur Zahlen akzeptiert
TextField("Total number of people", text: $numOfPeople)
Das TextField erlaubt auch alphabetische Zeichen. Wie beschränke ich den Benutzer darauf, nur Zahlen einzugeben?
swiftui
swiftui-form
Lupyana Mbembati
quelle
quelle
Antworten:
Sie können den Tastaturtyp so einstellen, dass die Art der Tastatur eingeschränkt
TextField
wird.Die Dokumentation von Apple finden Sie hier. Eine Liste aller unterstützten Tastaturtypen finden Sie hier .
quelle
Das Anzeigen eines Nummernblocks ist zwar ein guter erster Schritt, verhindert jedoch nicht die Eingabe fehlerhafter Daten:
Was Sie wirklich tun möchten, ist die Eingabe wie folgt zu bereinigen:
Bei jeder
numOfPeople
Änderung werden die nicht numerischen Werte herausgefiltert und der gefilterte Wert verglichen, um festzustellen, ob ernumOfPeople
ein zweites Mal aktualisiert werden sollte, wobei die fehlerhafte Eingabe mit der gefilterten Eingabe überschrieben wird.Beachten Sie, dass der
Just
Herausgeber dies von Ihnen verlangtimport Combine
.BEARBEITEN:
Beachten Sie zur Erläuterung des
Just
Herausgebers den folgenden konzeptionellen Überblick darüber, was passiert, wenn Sie den Wert in ändernTextField
:TextField
aBinding
bis a benötigtString
, werden beim Ändern des Feldinhalts auch diese Änderungen in die@State
Variable zurückgeschrieben.@State
ändert, berechnet SwiftUI diebody
Eigenschaft der Ansicht neu.body
Berechnung wird einJust
Herausgeber erstellt. Combine hat viele verschiedene Publisher, die im Laufe der Zeit Werte ausgeben, aber derJust
Publisher nimmt "nur" einen einzelnen Wert (den neuen Wert vonnumberOfPeople
) und gibt ihn auf Anfrage aus.onReceive
Methode macht einenView
Abonnenten zu einem Herausgeber, in diesem Fall zu demJust
gerade erstellten Herausgeber. Nach dem Abonnieren werden sofort alle verfügbaren Werte vom Herausgeber abgefragt, von denen es nur einen gibt, den neuen Wert vonnumberOfPeople
.onReceive
Teilnehmer einen Wert erhält, führt er den angegebenen Abschluss aus. Unsere Schließung kann auf zwei Arten enden. Wenn der Text bereits nur numerisch ist, tut er nichts. Wenn der gefilterte Text unterschiedlich ist, wird er in die@State
Variable geschrieben, wodurch die Schleife erneut beginnt. Diesmal wird der Abschluss jedoch ausgeführt, ohne dass Eigenschaften geändert werden.Weitere Informationen finden Sie unter Verwenden von Kombinieren .
quelle
Just
Herausgebers hinzugefügt .Sie müssen nicht verwenden
Combine
undonReceive
können auch diesen Code verwenden:Leider gibt es auch ein kleines Flackern, so dass Sie auch die nicht erlaubten Zeichen für eine sehr kurze Zeit sehen können (in meinen Augen etwas kürzer als der Weg mit
Combine
)quelle
Ein anderer Ansatz besteht möglicherweise darin, eine Ansicht zu erstellen, die die TextField-Ansicht umschließt und zwei Werte enthält: eine private Variable, die den eingegebenen String enthält, und einen bindbaren Wert, der das Double-Äquivalent enthält. Jedes Mal, wenn der Benutzer ein Zeichen eingibt, versucht er, das Double zu aktualisieren.
Hier ist eine grundlegende Implementierung:
Sie könnten es so verwenden:
Dies ist ein einfaches Beispiel. Möglicherweise möchten Sie Funktionen hinzufügen, um eine Warnung für schlechte Eingaben anzuzeigen und möglicherweise Überprüfungen usw. zu begrenzen.
quelle