Ausgabe
Wie kann ich die maximale Anzahl von Zeichen in einem UITextField
auf dem iPhone SDK festlegen, wenn ich ein lade UIView
?
Lösung
Obwohl die UITextField
Klasse keine Eigenschaft max length hat, ist es relativ einfach, diese Funktionalität zu erhalten, indem Sie die Textfelder festlegen delegate
und 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.location
die Länge des aktuellen Felds und range.length
0, 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 string
mehr als ein Zeichen darin enthalten ist.
Das Löschen einzelner Zeichen oder das Ausschneiden mehrerer Zeichen wird durch ein Zeichen range
mit 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 UITextField
zu 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)