ios - länge - title tag wordpress




Maximale Länge UITextField (10)

Wenn ich versucht habe, wie Sie die maximale Anzahl von Zeichen, die in ein UITextField eingegeben werden können, mit swift einstellen? Ich habe gesehen, dass ich den Charakter nicht löschen kann, wenn ich alle 10 Zeichen verwende.

Das einzige, was ich tun kann, ist den Vorgang abzubrechen (alle Zeichen zusammen löschen).

Kann jemand die Tastatur nicht blockieren (so dass ich keine anderen Buchstaben / Symbole / Zahlen hinzufügen kann, aber ich kann die Rücktaste verwenden)?


Beachten Sie den in diesem Beitrag erwähnten Fehler beim Rückgängigmachen von UITextField: Legen Sie die maximale Zeichenlänge eines UITextFields fest

hier ist, wie Sie es in swift beheben

if(range.length + range.location > count(textField.text)) {
        return false;
}

Da Delegierte eine 1: 1-Beziehung sind und ich sie aus anderen Gründen an anderer Stelle verwenden möchte, möchte ich die Textfeldlänge einschränken, indem ich diesen Code innerhalb ihrer Konfiguration hinzufüge:

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        setup()
    }

    required override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    func setup() {

        // your setup...

        setMaxLength()
    }

    let maxLength = 10

    private func setMaxLength() {
            addTarget(self, action: #selector(textfieldChanged(_:)), for: UIControlEvents.editingChanged)
        }

        @objc private func textfieldChanged(_ textField: UITextField) {
            guard let text = text else { return }
            let trimmed = text.characters.prefix(maxLength)
            self.text = String(trimmed)

        }

Ich habe dieses Protokoll / meine Erweiterung in einer meiner Apps verwendet und es ist etwas lesbarer. Ich mag, wie es Backspaces erkennt und Ihnen explizit sagt, wenn ein Zeichen eine Rücktaste ist.

Einige Dinge zu beachten:

1. Was auch immer diese Protokollerweiterung implementiert, muss ein Zeichenlimit angeben. Das ist normalerweise Ihr ViewController, aber Sie könnten Zeichenbegrenzung 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 delegate-Methode sentChangeCharactersInRange Ihres Textfelds aufrufen. Andernfalls können Sie die Texteingabe nicht blockieren, indem Sie false usw. zurückgeben.

3. Wahrscheinlich möchten Sie Backspace-Zeichen durch zulassen. Deshalb habe ich die Extra-Funktion hinzugefügt, um Backspaces zu erkennen. Ihre shouldChangeCharacters-Methode kann dies überprüfen und "true" früh zurückgeben, sodass Sie immer Rücksprünge zulassen.

protocol TextEntryCharacterLimited{
    var characterLimit:Int { get } 
}

extension TextEntryCharacterLimited{

    func charactersInTextField(textField:UITextField, willNotExceedCharacterLimitWithReplacementString string:String, range:NSRange) -> Bool{

        let startingLength = textField.text?.characters.count ?? 0
        let lengthToAdd = string.characters.count
        let lengthToReplace = range.length

        let newLength = startingLength + lengthToAdd - lengthToReplace

        return newLength <= characterLimit

    }

    func stringIsBackspaceWith(string:String, inRange range:NSRange) -> Bool{
        if range.length == 1 && string.characters.count == 0 { return true }
        return false
    }

}

Wenn einer von euch interessiert ist, habe ich ein Github-Repo, wo ich etwas von diesem Charakter-Limit-Verhalten genommen und in ein iOS-Framework gesteckt habe. Es gibt ein Protokoll, das Sie implementieren können, um eine Twitter-ähnliche Zeichenlimitanzeige zu erhalten, die Ihnen anzeigt, wie weit Sie das Zeichenlimit überschritten haben.

CharacterLimited Framework auf Github


Ich habe eine Lösung mit IBInspectable gepostet, sodass Sie den Wert für die maximale Länge sowohl im Interface Builder als auch programmgesteuert ändern können. Schau es dir hier an


So mach ich es:

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    if (countElements(textField.text!) > maxLength) {
        textField.deleteBackward()
    }
}

Der Code funktioniert für mich. Aber ich arbeite mit Storyboard. Im Storyboard füge ich eine Aktion für das Textfeld im View-Controller beim Bearbeiten hinzu .


Wenn Sie den letzten Buchstaben überschreiben wollen:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if range.location > 9 {
        textField.text?.removeLast()
    }

    return true
}

Schnell 3

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

            let nsString = NSString(string: textField.text!)
            let newText = nsString.replacingCharacters(in: range, with: string)
            return  newText.characters.count <= limitCount
    }

Update für Swift 4

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
     guard let text = textField.text else { return true }
     let newLength = text.count + string.count - range.length
     return newLength <= 10
}

Here is my version of code. Hope it helps!

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        let invalidCharacters = NSCharacterSet(charactersInString: "0123456789").invertedSet

        if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex))
        {
            return false
        }

        if (count(textField.text) > 10  && range.length == 0)
        {
            self.view.makeToast(message: "Amount entry is limited to ten digits", duration: 0.5, position: HRToastPositionCenter)
            return false
        }
        else
        {

        }

        return true
    }

func checkMaxLength(textField: UITextField!, maxLength: Int) {
        if (textField.text!.characters.count > maxLength) {
            textField.deleteBackward()
        }
}

eine kleine Änderung für IOS 9







max