Versuchen Sie unter Swift 5 und iOS 12 die folgende Implementierung einer textField(_:shouldChangeCharactersIn:replacementString:)
Methode, die Teil des UITextFieldDelegate
Protokolls ist:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- Der wichtigste Teil dieses Codes ist die Konvertierung von
range
( NSRange
) nach rangeOfTextToReplace
( Range<String.Index>
). In diesem Video-Tutorial erfahren Sie , warum diese Konvertierung wichtig ist.
- Damit dieser Code ordnungsgemäß funktioniert, sollten Sie auch den Wert von
textField
' smartInsertDeleteType
auf setzen UITextSmartInsertDeleteType.no
. Dies verhindert das mögliche Einfügen eines (unerwünschten) zusätzlichen Speicherplatzes beim Ausführen eines Einfügevorgangs.
Der komplette Beispielcode unten zeigt , wie zur Umsetzung textField(_:shouldChangeCharactersIn:replacementString:)
in ein UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
text.characters.count
ist die Verwendung veraltettext.count
So mach ich es:
Der Code funktioniert bei mir. Aber ich arbeite mit Storyboard. Im Storyboard füge ich beim Bearbeiten eine Aktion für das Textfeld im View Controller hinzu .
quelle
Update für Swift 4
quelle
Weitere Details aus der @ Martin-Antwort hinzufügen
quelle
In Swift 4
10 Zeichen begrenzen für Textfeld und erlauben das Löschen (Rücktaste)
quelle
eine kleine Änderung für IOS 9
quelle
Swift 3
quelle
Sie können UITextField erweitern und ein
@IBInspectable
Objekt hinzufügen, um es zu behandeln:SWIFT 5
und danach definieren Sie es im Attributinspektor
Siehe Swift 4 Originalantwort
quelle
Wenn Sie den letzten Buchstaben überschreiben möchten:
quelle
Ich habe eine Lösung mit gepostet
IBInspectable
, sodass Sie den Wert für die maximale Länge sowohl im Interface Builder als auch programmgesteuert ändern können. Schau es dir hier anquelle
Sie können in Swift 5 oder Swift 4 verwenden, wie das Bild wie unten aussieht
Fügen Sie den Code in der Ansicht ViewController hinzu
Sie können das vollständige Quellformular von GitHub herunterladen: https://github.com/enamul95/TextFieldMaxLen
quelle
Beachten Sie den in diesem Beitrag erwähnten Rückgängig-Fehler für UITextField: Legen Sie die maximale Zeichenlänge eines UITextField fest
Hier erfahren Sie, wie Sie das Problem schnell beheben
quelle
quelle
Ich habe dieses Protokoll / diese Erweiterung in einer meiner Apps verwendet und es ist etwas besser lesbar. Mir gefällt, wie es Backspaces erkennt und Ihnen explizit sagt, wann ein Zeichen ein Backspace ist.
Einige Dinge zu beachten:
1.Was auch immer diese Protokollerweiterung implementiert, muss eine Zeichenbeschränkung angeben. Dies ist normalerweise Ihr ViewController. Sie können jedoch die Zeichenbeschränkung als berechnete Eigenschaft implementieren und etwas anderes zurückgeben, z. B. eine Zeichenbeschränkung für eines Ihrer Modelle.
2. Sie müssen diese Methode innerhalb der delegierten Methode shouldChangeCharactersInRange Ihres Textfelds aufrufen. Andernfalls können Sie die Texteingabe nicht blockieren, indem Sie false usw. zurückgeben.
3. Sie möchten wahrscheinlich Rücktaste durchlassen. Aus diesem Grund habe ich die zusätzliche Funktion zum Erkennen von Backspaces hinzugefügt. Ihre shouldChangeCharacters-Methode kann dies überprüfen und frühzeitig 'true' zurückgeben, sodass Sie immer Backspaces zulassen.
Wenn einer von Ihnen interessiert ist, habe ich ein Github-Repo, in dem ich einige dieser Zeichenbeschränkungsverhaltensweisen übernommen und in ein iOS-Framework integriert habe. Es gibt ein Protokoll, das Sie implementieren können, um eine Twitter-ähnliche Anzeige für die Zeichenbegrenzung zu erhalten, die anzeigt, wie weit Sie die Zeichenbegrenzung überschritten haben.
CharacterLimited Framework auf Github
quelle
Da es sich bei den Delegierten um eine 1-zu-1-Beziehung handelt und ich sie aus anderen Gründen möglicherweise an anderer Stelle verwenden möchte, möchte ich die Länge des Textfelds einschränken und diesen Code in das Setup aufnehmen:
quelle
Ich benutze das;
Limit 3 char
quelle
Swift 5
quelle
Sie müssen überprüfen, ob die vorhandene Zeichenfolge plus die Eingabe größer als 10 ist.
quelle