Input-mask-ios: Probleme mit Leerzeichen

Erstellt am 24. Mai 2018  ·  6Kommentare  ·  Quelle: RedMadRobot/input-mask-ios

Ich habe zwei Probleme mit Leerzeichen.

  1. Ich habe diese Maske für Kreditkarte: "[0000] [0000] [0000] [0000] [999]" aber das Hauptproblem ist, wenn der Benutzer mit der Eingabe obligatorischer Zahlen fertig ist, wird immer noch angezeigt, dass er nicht abgeschlossen ist, da der Benutzer das Leerzeichen nicht vor [999] . Wie kann ich dieses Problem beheben?

  2. Ich habe diese Maske für die Namenseingabe: [A…] aber ich kann keine Leerzeichen eingeben, und es scheint, dass es dafür kein Symbol gibt. Ich habe sogar versucht, meine benutzerdefinierte Notation für Leerzeichen zu erstellen, aber kein Erfolg. Wie kann ich mindestens einen Buchstaben und optionale Leerzeichen zulassen?

Danke für diese tolle Bibliothek!

feature request question

Alle 6 Kommentare

Hallo @caioremedio!
Danke für Ihre Fragen. Ich sehe bereits eine potenzielle Funktionsanfrage.

Erstens , für Ihre "[0000] [0000] [0000] [0000] [999]" Kreditkartenmaske könnten benutzerdefinierte Notationen Ihre Antwort sein. Sie benötigen ein optionales Leerzeichen, wie folgt:

"[0000] [0000] [0000] [0000][s][999]"

Notation(character: "s", characterSet: CharacterSet(charactersIn: " "), isOptional: true)

– bitte probieren Sie es aus und teilen Sie mir Ihre Ergebnisse mit.

Zweitens bemerkte ich einen Logikfehler in unserem Compiler . Im Moment versucht unsere Bibliothek, die Eigenschaften von […] abhängig vom vorherigen Zeichen zu erben, und unterstützt keine benutzerdefinierten Notationen für dieses vorherige Zeichen (siehe Link).

Ich muss die Bibliothek für Ihre Bedürfnisse aktualisieren, okay?

Hallo @taflanidi , danke für die schnelle Antwort.

Erstens: Ich habe es mit [s] versucht, aber es werden keine Leerzeichen automatisch eingefügt. Verpasse ich hier etwas?

Ich verwende die Unterklasse von MaskedTextFieldDelegate , ich habe einige benutzerdefinierte Inits für customNotations :

class NotifyingMaskedTextFieldDelegate: MaskedTextFieldDelegate {

    weak var editingListener: NotifyingMaskedTextFieldDelegateListener?

    override init(format: String) {
        super.init(format: format)
    }

    convenience init(format: String, customNotations: [Notation]) {
        self.init(format: format)
        self.customNotations = customNotations
    }

    convenience init(format: String, customNotation: Notation) {
        self.init(format: format, customNotations: [customNotation])
    }
}

Initialisieren:

NotifyingMaskedTextFieldDelegate(
    format: "[0000] [0000] [0000] [0000][s][999]",
    customNotation: Notation(character: "s",
                             characterSet: CharacterSet(charactersIn: " "),
                             isOptional: true))

Zweitens: In Ordnung, aber ist es möglich, nur Leerzeichen in den Compiler aufzunehmen (zusammen mit Zahlen und Buchstaben)?

Danke für die Unterstützung.

Hallo @caioremedio ,

Ich habe es mit [s] versucht, aber es werden keine Leerzeichen automatisch eingefügt. Verpasse ich hier etwas?

Ach, das habe ich vergessen. Ich habe es sogar am Ende des Readme-Abschnitts für benutzerdefinierte Notationen erwähnt .

Ich verwende eine Unterklasse von MaskedTextFieldDelegate, ich habe einige benutzerdefinierte Inits für customNotations erstellt

Sie brauchen eigentlich keine Unterklassen. MaskedTextFieldDelegate hat eine entsprechende öffentliche Variable customNotations , und Sie weisen ihr einfach Ihre Notationsliste zu.

Außerdem sehe ich jetzt, dass Sie mit diesem Ansatz ein weiteres Problem mit Ihrem extrahierten Wert erhalten. Um genau zu sein, dieses Problem: 1234123412341234 999 — ein unnötiges Leerzeichen.

ABER es gibt einen anderen Ansatz, den Sie verwenden können, um zu definieren, dass der Wert vollständig ist. Mask Instanzen und der Wrapper MaskedTextFieldDelegate bieten eine Reihe von berechneten Metriken für den Text und den extrahierten Wert, wie acceptableTextLength , totalTextLength usw.

MaskedTextFieldDelegate.acceptableValueLength() gibt in Ihrem Fall 16 zurück, sodass Sie die Länge des extrahierten Werts damit vergleichen können, um zu definieren, dass die Eingabe abgeschlossen ist.


  1. > Okay, aber ist es möglich, nur Leerzeichen in den Compiler aufzunehmen (zusammen mit Zahlen und Buchstaben)?

Um das Verhalten zu definieren, muss Compiler die Art des vorangestellten Auslassungszeichens kennen:

[A…]
 ^ this one defines, what symbols are accepted

Im Moment ist Compiler auf die Grundausstattung von A a 0 9 - _ . Benutzerdefinierte Notationen funktionieren nicht, wenn es um elliptische Masken geht. Dies ist eine Funktion, die implementiert werden muss.

Ach, das habe ich vergessen. Ich habe es sogar am Ende des Readme-Abschnitts für benutzerdefinierte Notationen erwähnt.

Oh mein Gott, hab das nicht gemerkt.

Sie brauchen eigentlich keine Unterklassen. MaskedTextFieldDelegate hat eine entsprechende öffentliche Variable customNotations, und Sie weisen ihr einfach Ihre Notationsliste zu.

Nein, ich bilde keine Unterklassen nur für die benutzerdefinierte Notation ab, sondern verwende sie für andere Ansätze (Überschreiben von UITextField Methoden). Ich habe das nur kommentiert, weil ich dachte, dass die automatische Vervollständigung nicht funktioniert, ein Fehler ist, also habe ich einfach alles geschrieben, was ich tat.

MaskedTextFieldDelegate.acceptableValueLength() gibt in Ihrem Fall 16 zurück, sodass Sie die Länge des extrahierten Werts damit vergleichen können, um zu definieren, dass die Eingabe abgeschlossen ist.

Super, funktionierte wie ein Zauber. Also anstatt zu prüfen, ob completed == true , sollte ich mich jetzt auf value.count > MaskedTextFieldDelegate.acceptableValueLength() richtig? Ich habe hier getestet und scheint in allen Fällen zu funktionieren.

Benutzerdefinierte Notationen funktionieren nicht, wenn es um elliptische Masken geht. Dies ist eine Funktion, die implementiert werden muss.

Erwischt. In der Zwischenzeit werde ich dafür den Standardwert UITextFieldDelegate .

Um das Verhalten zu definieren, muss der Compiler die Art des vorangestellten Auslassungszeichens kennen:

Oh, was ich meine war, anstatt benutzerdefinierte Notationen (wenn es zu viel Arbeit macht) mit Auslassungszeichen zu implementieren, implementieren Sie einfach Leerzeichen.

Danke noch einmal!

@caioremedio ,

Super, funktionierte wie ein Zauber. Anstatt zu überprüfen, ob abgeschlossen == true, sollte ich mich jetzt auf value.count > MaskedTextFieldDelegate.acceptableValueLength() verlassen, oder?

Ja.

Oh, was ich meine war, anstatt benutzerdefinierte Notationen (wenn es zu viel Arbeit macht) mit Auslassungszeichen zu implementieren, implementieren Sie einfach Leerzeichen.

Tatsächlich würde die Verwendung von benutzerdefinierten Notationen hier weniger Arbeit von unserer Seite erfordern.

Erwischt. In der Zwischenzeit werde ich dafür das Standard-UITextFieldDelegate verwenden.

Bleiben Sie dran für die Compiler Updates dieses Wochenende.

@caioremedio ,

Okay, elliptische Masken unterstützen jetzt auch benutzerdefinierte Notationen.

Schauen Sie sich die neuesten 3.4.1 .

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

MrJox picture MrJox  ·  11Kommentare

SteynMarnus picture SteynMarnus  ·  11Kommentare

LinusGeffarth picture LinusGeffarth  ·  4Kommentare

Robuske picture Robuske  ·  4Kommentare

razalur picture razalur  ·  3Kommentare