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.
Réponses
Trop de publicités?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
}
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")
}
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.
- Réponses précédentes
- Plus de réponses
0 votes
Voir ma réponse à la question en double ici