web-dev-qa-db-ger.com

Ändern Sie die 'Return'-Tastenfunktion in Swift in UITextView in' Done '

Ich möchte die "Return" -Funktion der Tastatur loswerden, während der Benutzer tippt. Daher gibt es keine neuen Zeilen. Ich möchte stattdessen, dass die Return-Taste als "Done" fungiert, sodass die Tastatur ausgeblendet wird .

Ich verwende ein UITextView, das editierbar ist, so dass der Benutzer seinen Beitrag eingeben und auf der Hauptzeitleiste veröffentlichen kann. Da ich jedoch feste Zellen habe, möchte ich nicht, dass der Benutzer die Eingabetaste drücken kann. und ihr Beitrag wäre außerhalb der Reichweite der Zeitleiste. 

Ich habe festgestellt, dass dies mit UITextField funktioniert, aber nicht mit UITextView:

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    textField.resignFirstResponder()  //if desired
    return true
}

Ich wollte also nur wissen, ob es eine Möglichkeit gibt, dies in einer UITextView zu tun, oder zumindest die Tastatur ausblenden zu können, wenn Sie die Eingabetaste drücken, anstatt eine neue Zeile zu erstellen.

27
Bruno Recillas

Sie können den Rückgabeschlüsseltyp des Textfelds festlegen:

textField.returnKeyType = UIReturnKeyType.Done

Update Sie können auf jeden Fall den Return-Schlüssel auf "Done" setzen, wie oben erwähnt. UITextView bietet jedoch keinen Rückruf, wenn der Benutzer die Eingabetaste drückt. Als Problemumgehung können Sie versuchen, den Delegataufruf textView (textView: UITextView, shouldChangeTextInRange: NSRange, replacementText text: String) zu behandeln und die Tastatur zu schließen, wenn Sie die Eingabe eines neuen Zeilenzeichens feststellen:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if (text == "\n") {
        textView.resignFirstResponder()
    }
    return true
}
76
utogaria

Ich habe viele Codes ausprobiert und dies hat letztendlich in Swift 3.0 für mich funktioniert. Spätestens [März 2017] dies mit UITextFields erreicht

Die "ViewController" -Klasse sollte von "UITextFieldDelegate" geerbt werden, damit dieser Code funktioniert.

class ViewController: UIViewController,UITextFieldDelegate  

Fügen Sie das Textfeld mit der richtigen Tag-Nummer hinzu. Diese Tag-Nummer wird verwendet, um das Steuerelement auf der Grundlage der ihm zugewiesenen inkrementellen Tag-Nummer in das entsprechende Textfeld zu bringen.

override func viewDidLoad() {

    userNameTextField.delegate = self
    userNameTextField.tag = 0
    userNameTextField.returnKeyType = .next
    passwordTextField.delegate = self
    passwordTextField.tag = 1
    passwordTextField.returnKeyType = .go
}

Im obigen Code, der "returnKeyType = UIReturnKeyType.next", wobei die Rücktaste des Tastenfelds als "Weiter" angezeigt wird, haben Sie auch andere Optionen wie "Join/Go" usw., abhängig von Ihrer Anwendung, die Werte ändert.

Diese "textFieldShouldReturn" ist eine von UITextFieldDelegate gesteuerte Methode. Hier haben wir die nächste Feldauswahl basierend auf der Tag-Wert-Inkrementierung.

func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
    if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
        return true;
    }
    return false
}

Wenn Sie mit einem Storyboard oder xib arbeiten, können Sie die Return-Schaltfläche UITextView's In Interface Builder auf 'Fertig' (oder auf verschiedene andere Optionen) setzen, ohne dass Sie einen Setup-Code benötigen. Suchen Sie nach dieser Option im Attribut-Inspektor :

Return Key option in Interface Builder

Von dort aus koppeln Sie es einfach mit dem Code UITextViewDelegate, den andere hier bereits angegeben haben.

Swift v5:

extension ExampleViewController: UITextViewDelegate {

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if (text == "\n") {
            textView.resignFirstResponder()
        }
        return true
    }
}

Und dann in Ihrer viewDidLoad() Methode:

exampleTextView.delegate = self

1
TheNeil

Arbeiten in Swift 4

Fügen Sie dies in viewDidLoad () hinzu.

textField.returnKeyType = UIReturnKeyType.Done

Fügen Sie dies an beliebiger Stelle hinzu.

extension UITextView: UITextViewDelegate {
    public func textViewDidChange(_ textView: UITextView) {
        if text.last == "\n" { //Check if last char is newline
            text.removeLast() //Remove newline
            textView.resignFirstResponder() //Dismiss keyboard
        }
    }
}
0
Erik Nguyen