Wie kann ich die maximale Anzahl von Zeichen in a UITextField
auf dem iPhone SDK festlegen, wenn ich a lade UIView
?
ios
objective-c
cocoa-touch
uitextfield
Domness
quelle
quelle
Antworten:
Obwohl die
UITextField
Klasse keine Eigenschaft für die maximale Länge hat, ist es relativ einfach, diese Funktionalität zu erhalten, indem Sie die Textfelder festlegendelegate
und die folgende Delegatenmethode implementieren:Ziel c
Schnell
Bevor das Textfeld ändert, fragt der UITextField die Delegaten , wenn der angegebene Text soll geändert werden. Das Textfeld hat sich zu diesem Zeitpunkt nicht geändert, daher ermitteln wir die aktuelle Länge und die Länge der Zeichenfolge, die wir einfügen (entweder durch Einfügen von kopiertem Text oder durch Eingabe eines einzelnen Zeichens über die Tastatur), abzüglich der Bereichslänge. Wenn dieser Wert zu lang ist (in diesem Beispiel mehr als 25 Zeichen), kehren Sie zurück
NO
, um die Änderung zu verhindern.Wenn Sie ein einzelnes Zeichen am Ende eines Textfelds eingeben,
range.location
ist dies die Länge des aktuellen Felds undrange.length
0, da wir nichts ersetzen / löschen. Das Einfügen in die Mitte eines Textfelds bedeutet nur ein anderesrange.location
Zeichen, und das Einfügen mehrerer Zeichen bedeutet nur, dassstring
mehr als ein Zeichen enthalten ist.Das Löschen einzelner Zeichen oder das Ausschneiden mehrerer Zeichen wird durch a
range
mit einer Länge ungleich Null und einer leeren Zeichenfolge angegeben. Das Ersetzen ist nur eine Bereichslöschung durch eine nicht leere Zeichenfolge.Ein Hinweis zum abstürzenden "Rückgängig" -Fehler
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 weiterhin im Rückgängig-Puffer der Anwendung aufgezeichnet. Wenn Sie dann eine Undo - Feuer (durch Schütteln des Geräts und eine Undo - Bestätigung), die
UITextField
versucht, die Zeichenfolge zu ersetzen es denkt , dass es in sich mit einem leeren String eingefügt. Dies wird abstürzen , weil es nie wirklich die Zeichenfolge in an sich selbst geklebt. Es wird versucht, einen Teil der Zeichenfolge zu ersetzen, der nicht vorhanden ist.Glücklicherweise können Sie die vor dem
UITextField
Töten selbst so schützen . Sie müssen nur sicherstellen , dass der Bereich schlägt sie zu ersetzen tut exist in seinem aktuellen String. Dies ist, was die obige anfängliche Überprüfung der geistigen Gesundheit bewirkt.Swift 3.0 mit Kopieren und Einfügen funktioniert einwandfrei.
Hoffe es ist hilfreich für dich.
quelle
return newLength <= 25;
UITextField
auf iPad iOS 8.1. (+1 zum Kommentieren). Würde der Autor etwas dazu hinzufügen, da dies die am besten bewertete Antwort ist? Ich mache gerne eine Bearbeitung, aber meine scheinen regelmäßig abgelehnt zu werden! :-)Swift 4
Bearbeiten: Speicherverlust behoben.
quelle
Danke August! ( Post )
Dies ist der Code, mit dem ich am Ende gearbeitet habe:
quelle
return textField.text.length < MAX_LENGTH || range.length != 0;
Um die Antwort vom August zu vervollständigen , eine mögliche Implementierung der vorgeschlagenen Funktion (siehe Delegierter von UITextField ).
Ich habe den Domness- Code nicht getestet , aber meiner bleibt nicht hängen , wenn der Benutzer das Limit erreicht hat, und er ist mit einer neuen Zeichenfolge kompatibel, die eine kleinere oder gleichwertige ersetzt.
quelle
Sie können dies nicht direkt tun -
UITextField
hat kein maxLength- Attribut, aber Sie können denUITextField's
Delegaten festlegen und dann Folgendes verwenden:quelle
Oft haben Sie mehrere Eingabefelder mit unterschiedlicher Länge.
quelle
Der beste Weg wäre, eine Benachrichtigung über die Textänderung einzurichten. In Ihrer
-awakeFromNib
View Controller-Methode möchten Sie:Dann in derselben Klasse hinzufügen:
Verbinden Sie dann den Ausgang
myTextField
mit IhremUITextField
und Sie können keine weiteren Zeichen hinzufügen, nachdem Sie das Limit erreicht haben. Stellen Sie sicher, dass Sie dies zu Ihrer Dealloc-Methode hinzufügen:quelle
Ich habe diese UITextFieldLimit-Unterklasse erstellt:
Holen Sie sich das
UITextFieldLimit.h
undUITextFieldLimit.m
aus diesem GitHub-Repository:https://github.com/JonathanGurebo/UITextFieldLimit
und fang an zu testen!
Markieren Sie Ihr vom Storyboard erstelltes UITextField und verknüpfen Sie es mit dem Identitätsinspektor mit meiner Unterklasse:
Anschließend können Sie es mit einem IBOutlet verknüpfen und das Limit festlegen (Standard ist 10).
Ihre ViewController.h-Datei sollte Folgendes enthalten: (wenn Sie die Einstellung nicht ändern möchten, z. B. das Limit)
Ihre ViewController.m-Datei sollte
@synthesize textFieldLimit
.Legen Sie die Textlängenbeschränkung in Ihrer ViewController.m-Datei fest:
Hoffe die Klasse hilft dir. Viel Glück!
quelle
Dies sollte ausreichen, um das Problem zu lösen (ersetzen Sie 4 durch das gewünschte Limit). Stellen Sie einfach sicher, dass Sie einen Delegaten in IB hinzufügen.
quelle
Verwenden Sie die folgende Erweiterung, um die maximale Zeichenlänge von a
UITextField
und festzulegenUITextView
.Swift 4.0
UITextView
Sie können das Limit unten festlegen.
quelle
Ich simuliere den tatsächlichen String-Austausch, der passieren wird, um die Länge des zukünftigen Strings zu berechnen:
quelle
Swift 3 Version // ***** Dies funktioniert NICHT mit Swift 2.x! ***** //
Erstellen Sie zuerst eine neue Swift-Datei: TextFieldMaxLength.swift, und fügen Sie dann den folgenden Code hinzu:
und dann sehen Sie im Storyboard ein neues Feld (Max Length), wenn Sie ein TextField auswählen
Wenn Sie noch weitere Fragen haben, besuchen Sie diesen Link: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -maximum-length-visual-studio-style /
quelle
Mit dem Interface Builder können Sie das Ereignis für "Bearbeiten geändert" in einer beliebigen Ihrer Funktionen verknüpfen und abrufen. Jetzt können Sie dort die Länge überprüfen
quelle
Der folgende Code ähnelt der Antwort von sickp, behandelt jedoch das Kopieren und Einfügen korrekt. Wenn Sie versuchen, einen Text einzufügen, der länger als das Limit ist, schneidet der folgende Code den Text so ab, dass er dem Limit entspricht, anstatt den Einfügevorgang vollständig abzulehnen.
quelle
Es gibt eine generische Lösung zum Festlegen der maximalen Länge in Swift. Mit IBInspectable können Sie im Xcode Attribute Inspector ein neues Attribut hinzufügen.
quelle
Damit es mit dem Ausschneiden und Einfügen von Zeichenfolgen beliebiger Länge funktioniert, würde ich vorschlagen, die Funktion wie folgt zu ändern:
quelle
Swift 4
quelle
guard
?Swift 2.0 +
Erstellen Sie zunächst eine Klasse für diesen Prozess. Nennen wir es StringValidator.swift.
Fügen Sie dann einfach den folgenden Code ein.
Speichern Sie jetzt die Klasse .....
Verwendungszweck..
Gehen Sie jetzt zu Ihrer viewController.swift-Klasse und machen Sie die Outlets Ihres Textfelds zu ..
Gehen Sie nun zur Methode shouldChangeCharactersInRange des Textfelds und verwenden Sie sie wie folgt.
Vergessen Sie nicht, das Delegatenprotokoll / die Methoden für Textfelder festzulegen.
Lassen Sie mich das erklären ... Ich verwende den einfachen Erweiterungsprozess von Zeichenfolgen, den ich in einer anderen Klasse geschrieben habe. Jetzt rufe ich nur diese Erweiterungsmethoden aus einer anderen Klasse auf, in der ich sie benötige, indem ich check und den Maximalwert hinzufüge.
Eigenschaften...
Typen ...
enthältOnlyCharactersIn // Akzeptiert nur Zeichen.
enthältCharactersIn // Akzeptiert eine Kombination von Zeichen
doesNotContainsCharactersIn // Akzeptiert keine Zeichen
Hoffe das hat geholfen .... Danke ..
quelle
schnell 3.0
Dieser Code funktioniert einwandfrei, wenn Sie Zeichenfolgen mehr als Ihre Zeichenbeschränkungen einfügen.
Danke für deine Stimmen. :) :)
quelle
Ich gebe eine ergänzende Antwort basierend auf @Frouo. Ich denke, seine Antwort ist der schönste Weg. Weil es eine übliche Kontrolle ist, die wir wiederverwenden können.
quelle
Dies ist die richtige Methode, um die maximale Länge in UITextField zu verarbeiten. Sie ermöglicht es der Eingabetaste, das Textfeld als Ersthelfer zu verlassen, und lässt den Benutzer die Rücktaste zurück, wenn er das Limit erreicht
quelle
Was ist mit diesem einfachen Ansatz? Es funktioniert gut für mich.
Dann:
quelle
Andere Antworten behandeln nicht den Fall, in dem der Benutzer eine lange Zeichenfolge aus der Zwischenablage einfügen kann. Wenn ich eine lange Zeichenfolge einfüge, sollte sie nur abgeschnitten, aber angezeigt werden. Verwenden Sie dies in Ihrem Delegaten:
quelle
Habe es auf 1 Codezeile reduziert :)
Setzen Sie den Delegaten
<UITextViewDelegate>
Ihrer Textansicht auf "self" und fügen Sie dann den Code in Ihrer .h und den folgenden Code in Ihre .m ein. Sie können die Zahl "7" so einstellen, dass sie der gewünschten maximalen Zeichenanzahl entspricht.Dieser Code berücksichtigt das Eingeben neuer Zeichen, das Löschen von Zeichen, das Auswählen von Zeichen, das anschließende Eingeben oder Löschen, das Auswählen von Zeichen und das Ausschneiden, das Einfügen im Allgemeinen sowie das Auswählen von Zeichen und das Einfügen.
Erledigt!
Alternativ wäre eine andere coole Möglichkeit, diesen Code mit Bitoperationen zu schreiben
quelle
Ich habe eine UITextField-Unterklasse, STATextField , als Open-Source-Version bereitgestellt , die diese Funktionalität (und vieles mehr) mit ihrer
maxCharacterLength
Eigenschaft bietet .quelle
Nun, wie viele Zeichen du willst, gib nur Werte an
quelle
Verwenden Sie diesen Code hier. RESTRICTED_LENGTH ist die Länge, die Sie für das Textfeld einschränken möchten.
quelle
Ich habe dies in Swift für ein Limit von 8 Zeichen gemacht, wenn ich einen Nummernblock verwendet habe.
Ich musste auf string! = "" Testen, damit die Schaltfläche "Löschen" auf dem Nummernblock funktioniert, da sonst das Löschen von Zeichen im Textfeld nach Erreichen des Maximums nicht mehr möglich ist.
quelle
Für Xamarin:
quelle
Ich habe eine UITextField-Erweiterung implementiert, um ihr eine maxLength-Eigenschaft hinzuzufügen.
Es basiert auf Xcode 6 IBInspectables, sodass Sie das maxLength-Limit im Interface Builder festlegen können.
Hier ist die Implementierung:
quelle