[FIXED] Legen Sie die maximale Zeichenlänge eines UITextField fest

Ausgabe

Wie kann ich die maximale Anzahl von Zeichen in einem UITextFieldauf dem iPhone SDK festlegen, wenn ich ein lade UIView?

Lösung

Obwohl die UITextFieldKlasse keine Eigenschaft max length hat, ist es relativ einfach, diese Funktionalität zu erhalten, indem Sie die Textfelder festlegen delegateund die folgende Delegate-Methode implementieren:

Ziel c

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }
        
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

Schnell

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
    let currentCharacterCount = textField.text?.count ?? 0
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentCharacterCount + string.count - range.length
    return newLength <= 25
}

Bevor sich das Textfeld ändert, fragt UITextField den Delegaten, ob der angegebene Text geändert werden soll. Das Textfeld hat sich zu diesem Zeitpunkt nicht geändert, also nehmen wir seine aktuelle Länge und die Zeichenfolgenlänge, die wir einfügen (entweder durch Einfügen von kopiertem Text oder durch Eingeben eines einzelnen Zeichens über die Tastatur), abzüglich der Bereichslänge. Wenn dieser Wert zu lang ist (mehr als 25 Zeichen in diesem Beispiel), kehren Sie zurück NO, um die Änderung zu verbieten.

Wenn Sie ein einzelnes Zeichen am Ende eines Textfelds eingeben, ist das range.locationdie Länge des aktuellen Felds und range.length0, da wir nichts ersetzen/löschen. Das Einfügen in die Mitte eines Textfelds bedeutet nur ein anderes range.location, und das Einfügen mehrerer Zeichen bedeutet nur, dass stringmehr als ein Zeichen darin enthalten ist.

Das Löschen einzelner Zeichen oder das Ausschneiden mehrerer Zeichen wird durch ein Zeichen rangemit einer Länge ungleich Null und eine leere Zeichenfolge angegeben. Das Ersetzen ist nur eine Bereichslöschung mit einer nicht leeren Zeichenfolge.

Eine Anmerkung zum abstürzenden “Undo”-Bug

Wie in den Kommentaren erwähnt, gibt es einen Fehler UITextField, der zu einem Absturz führen kann.

Wenn Sie in das Feld einfügen, das Einfügen jedoch durch Ihre Validierungsimplementierung verhindert wird, wird der Einfügevorgang dennoch im Undo-Puffer der Anwendung aufgezeichnet. Wenn Sie dann ein Rückgängigmachen auslösen (indem Sie das Gerät schütteln und ein Rückgängigmachen bestätigen), versucht das, die Zeichenfolge, von der es glaubt , es in sich selbst eingefügt zu haben, durch eine leere Zeichenfolge UITextFieldzu ersetzen . Dies wird abstürzen, da es die Zeichenfolge nie in sich selbst eingefügt hat. Es wird versucht, einen Teil der Zeichenfolge zu ersetzen, der nicht vorhanden ist.

Glücklicherweise können Sie den so davor schützen UITextField, sich selbst zu töten. Sie müssen nur sicherstellen, dass der zu ersetzende Bereich in der aktuellen Zeichenfolge vorhanden ist . Dies ist, was die anfängliche Plausibilitätsprüfung oben tut.

Swift 3.0 mit Kopieren und Einfügen funktioniert einwandfrei.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

Hoffe, es ist hilfreich für Sie.


Beantwortet von –
Trashpanda


Antwort geprüft von –
Mildred Charles (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like