web-dev-qa-db-fra.com

Changer la fonction du bouton 'Retour' en 'Fait' dans Swift dans UITextView

Je souhaite supprimer la fonction "retour" du clavier pendant la frappe. Il n'y a donc pas de nouvelle ligne. Par conséquent, j'aimerais que la touche "retour" fonctionne comme "Terminé" afin de masquer le clavier. .

J'utilise une UITextView, qui est modifiable, afin que l'utilisateur puisse taper son message et le poster sur la timeline principale, mais comme j'ai des cellules fixes, je ne veux pas que l'utilisateur puisse appuyer sur "retour" et leur poste serait hors de portée de la chronologie. 

J'ai trouvé ceci qui fonctionne avec UITextField, mais pas avec UITextView:

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

Je voulais donc simplement savoir s’il existe un moyen de le faire dans une vue UITextView, ou au moins de pouvoir cacher le clavier si vous appuyez sur la touche Entrée, au lieu de créer une nouvelle ligne.

27
Bruno Recillas

Vous pouvez définir le type de clé de retour du champ de texte:

textField.returnKeyType = UIReturnKeyType.Done

Update Vous pouvez certainement utiliser la même approche pour définir la clé de retour sur "Terminé", comme indiqué ci-dessus. Cependant, UITextView ne fournit pas de rappel lorsque l'utilisateur appuie sur la touche de retour. En guise de solution de contournement, vous pouvez essayer de gérer l'appel textView textView (textView: UITextView, shouldChangeTextInRange: NSRange, textTextText: String) et de fermer le clavier lorsque vous détectez la saisie d'un nouveau caractère de ligne:

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

J'ai essayé de nombreux codes et cela a finalement fonctionné pour moi dans Swift 3.0 Dernier [mars 2017] grâce à UITextFields

La classe "ViewController" doit être héritée du "UITextFieldDelegate" pour que ce code fonctionne.

class ViewController: UIViewController,UITextFieldDelegate  

Ajoutez le champ de texte avec le numéro de balise approprié. Ce numéro de balise est utilisé pour amener le contrôle au champ de texte approprié en fonction du numéro de balise incrémentiel qui lui est attribué.

override func viewDidLoad() {

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

Dans le code ci-dessus, le code "returnKeyType = UIReturnKeyType.next" où la touche de retour du clavier à afficher en tant que "Suivant" contient également d'autres options telles que "Rejoindre/Aller", etc.

Ce "textFieldShouldReturn" est une méthode contrôlée par UITextFieldDelegate et nous avons ici la sélection de champ suivante basée sur l'incrémentation de la valeur de Tag.

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
}
3

Travailler chez Swift 4

Ajoutez ceci à viewDidLoad ().

textField.returnKeyType = UIReturnKeyType.Done

Ajoutez ceci n'importe où vous aimez.

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