75 votes

Comment désactiver/activer la touche retour dans un champ UITextField ?

Existe-t-il un moyen d'activer ou de désactiver de manière programmatique la touche Retour sur l'écran du UIKeyboard ? Le plus proche que j'ai pu trouver est enablesReturnKeyAutomatically mais cela permettra seulement de savoir s'il faut le désactiver ou non.

0 votes

Voir ma réponse à la question en double ici

1voto

Paul B Points 378

Permettez-moi de vous proposer une solution un peu plus simple, qui ne nécessite pas de sous-classe.

extension UITextFieldDelegate {
    func setReturnKeyState(for textField: UITextField, isEnabled: Bool, delay: Double? = nil) {
        textField.enablesReturnKeyAutomatically = false
        if textField.delegate != nil {
            if let delay = delay {
                DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
                    textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
                }
            } else {
                textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
            }
        }
    }
}

Utilisation d'un échantillon pratique

Définissez n'importe quelle condition, par exemple comme ceci :

private func validateInput(_ string: String?) -> Bool {
    (string?.count ?? 0) > 3
}

Appeler setReturnKeyState dans les méthodes de délégation, par exemple :

func textFieldDidBeginEditing(_ textField: UITextField) {
    setReturnKeyState(for: textField, isEnabled: validateInput(textField.text), delay: 0.1) // A bit hacky it needs delay here
}

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if var text = textField.text, let range = Range(range, in: text) {
        text.replaceSubrange(range, with: string)
        setReturnKeyState(for: textField, isEnabled: validateInput(text))
    }
    return true
}

0voto

Winston Du Points 26

Ma réponse à la Question en double copié sur :

Toutes les autres solutions ne répondent pas à la question. L'OP veut "griser" la touche retour du clavier pour envoyer un signal visuel à l'utilisateur.

Voici ma solution, qui fonctionne sur iOS 13. Il se peut que vous deviez modifier légèrement la solution pour d'autres versions d'iOS.

Tout d'abord, j'élargis UITextFieldDelegate .

func getKeyboard() -> UIView?
    {
        for window in UIApplication.shared.windows.reversed()
        {
            if window.debugDescription.contains("UIRemoteKeyboardWindow") {
                if let inputView = window.subviews
                    .first? // UIInputSetContainerView
                    .subviews
                    .first // UIInputSetHostView
                {
                    for view in inputView.subviews {
                        if view.debugDescription.contains("_UIKBCompatInputView"), let keyboard = view.subviews.first, keyboard.debugDescription.contains( "UIKeyboardAutomatic") {
                            return keyboard
                        }
                    }
                }

            }
        }
        return nil
    }

Ensuite, chaque fois que j'ai besoin de désactiver la touche "retour", nous pouvons le faire (remplacer delegate avec le nom de la variable de votre objet délégué) :

if let keyboard = delegate.getKeyboard(){
    keyboard.setValue(text == nil, forKey: "returnKeyEnabled")
}

-2voto

Rik Renich Points 348

Voici une technique disponible dans l'API documentée, mais qui ne fournit pas de retour visuel lorsque la touche Entrée est désactivée.

- (void)setup {
    // Or in init
    self.textField.delegate = self;
}

// <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // substitute your test here
    return [textField.text rangeOfString:@"@"].location != NSNotFound;
}

D'autres réponses ici peuvent être utilisées avec

[textField addTarget:self
              action:@selector(validateTextField:)
    forControlEvents:UIControlEventEditingChanged];

pour fournir un retour visuel dynamique au fur et à mesure que l'utilisateur tape.

-3voto

Gaurav aka sparsh Points 1169

Les éléments suivants activeront/désactiveront automatiquement la touche de retour.

> - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
> 
>     textfield.enablesReturnKeyAutomatically = YES;
>     
>     // your code here
>    
>      return YES; }

-3voto

Jean Luiz Points 22

Essayez d'utiliser un UITextField ! pour recevoir cette chaîne de caractères, puis le retour disparaît !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X