Existe-t-il un moyen de détecter lorsque la touche Backspace/ Deleteest enfoncée dans le clavier de l'iPhone sur un UITextField
qui est vide? Je veux savoir quand Backspaceest pressé seulement si le UITextField
est vide.
Sur la base de la suggestion de @Alex Reynolds dans un commentaire, j'ai ajouté le code suivant lors de la création de mon champ de texte:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
Cette notification est reçue (la handleTextFieldChanged
fonction est appelée), mais toujours pas lorsque j'appuie sur la Backspacetouche dans un champ vide. Des idées?
Il semble y avoir une certaine confusion autour de cette question. Je souhaite recevoir une notification lorsque la Backspacetouche est enfoncée. C'est tout. Mais la solution doit également fonctionner lorsque le UITextField
est déjà vide.
la source
Réponses:
Cela peut être long, mais cela pourrait fonctionner. Essayez de définir le texte du champ de texte sur un caractère d'espace de largeur zéro
\u200B
. Lorsque vous appuyez sur Retour arrière sur un champ de texte qui apparaît vide, cela supprimera votre espace. Ensuite, vous pouvez simplement réinsérer l'espace.Peut ne pas fonctionner si l'utilisateur parvient à déplacer le curseur vers la gauche de l'espace.
la source
UITextField
et mettre en œuvrecanPerformAction:withSender:
àreturn NO
desselect:
etselectAll:
actions lorsque le texte est égal à la chaîne@"\u200B"
.Swift 4:
Sous
UITextField
- classe :La mise en oeuvre:
Objectif c:
Sous
UITextField
- classe :Maintenant, ajoutez simplement MyTextFieldDelegate à votre
UIViewController
et définissez votreUITextFields
myDelegate surself
:la source
ViewController
classe si je définis le délégué de monUITextField
UIViewController
deleteBackward()
ne sera pas appelé si vous êtesreturn false
danstextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Mise à jour: voir la réponse de JacobCaraballo pour un exemple qui remplace
-[UITextField deleteBackward]
.Check out
UITextInput
, a spécifiquementUIKeyInput
unedeleteBackward
méthode de délégué qui est toujours appelée lorsque la touche de suppression est enfoncée. Si vous faites quelque chose de simple, vous pouvez envisager de simplement sous-classerUILabel
et de le rendre conforme auUIKeyInput
protocole, comme le font SimpleTextInput et cet exemple d'iPhone UIKeyInput . Remarque:UITextInput
et ses proches (y comprisUIKeyInput
) ne sont disponibles que dans iOS 3.2 et versions ultérieures.la source
Code comme suit:
Enfin, n'oubliez pas de modifier la propriété Classe personnalisée du champ de texte en "MyTextField"
la source
Mise en œuvre rapide:
la source
J'ai fondé une autre manière plus simple que la
subclass
solution. Même c'est un peu étrange mais ça marche bien.C'est un peu étrange car le résultat de la comparaison est de -8. Peut-être que je me trompe à un moment donné
C Programming
. Mais son bon travail;)la source
strcmp
retours-1, 0, or 1
? C'était ma compréhension.UITextViewDelegate
méthodeUITextFieldDelegate
.Essaie le
delegate
Ensuite, vérifiez si le
range.length == 1
qui semble être le cas quandbackspace
est frappé.la source
Veuillez utiliser le code ci-dessous, il vous aidera à détecter la touche de suppression du clavier même si votre champ de texte est vide.
Objectif c :
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Rapide :
la source
La réponse de Niklas Alvaeus m'a aidé avec un problème similaire
Je limitais l'entrée à un jeu de caractères spécifique, mais j'ignorais les espaces arrière. Je l'ai donc fait vérifier
range.length == 1
avant de couper le fichierNSString
. Si c'est vrai, je renvoie simplement la chaîne et je ne la coupe pas. Voir ci-dessousla source
Pour ceux qui ont des problèmes avec la réponse de Jacob, j'ai implémenté ma sous-classe textfield comme suit et cela fonctionne très bien!
la source
Oui, utilisez la méthode ci-dessous pour détecter le retour arrière, lorsque textField est vide.
Besoin d'ajouter UITextFieldDelegate
yourTextField.delegate = self (DOIT REQUIS)
Rapide:
Objectif c:
la source
La meilleure utilisation que j'ai trouvée pour détecter le retour arrière est de détecter lorsque l'utilisateur a appuyé sur retour arrière dans un vide
UITextField
. Par exemple, si vous avez des destinataires «en bulles» dans l'application de messagerie, lorsque vous appuyez sur retour arrière dans leUITextField
, il sélectionne le dernier destinataire «en bulles».Cela peut être fait de la même manière que la réponse de Jacob Caraballo. Mais dans la réponse de Jacob, s'il
UITextField
reste un caractère lorsque vous appuyez sur retour arrière, au moment où le message du délégué est reçu, leUITextField
sera déjà vide, de sorte que vous détectez efficacementbackspace
sur un champ de texte avec au plus un caractère.En fait, si vous voulez détecter
backspace
sur unUITextField
avec exactement zéro caractère (vide), vous devez envoyer le message audelegate
avant l'appel àsuper deleteBackward
. Par exemple:L'interface d'un tel champ de texte ressemblerait à ceci:
la source
Dans iOS 6, la méthode deleteBackward est appelée sur UITextField lorsque vous appuyez sur Retour arrière, y compris lorsque le champ est vide. Vous pouvez donc sous-classer UITextField et fournir votre propre implémentation de deleteBackward (en invoquant également les super.)
Je supporte toujours iOS 5, donc j'aurai besoin d'une combinaison de la réponse d'Andrew et celle-ci.
la source
:) juste pour le titre "Détecter le retour arrière", où j'utilise
UIKeyboardTypeNumberPad
.Je rencontre également la même question ce soir, et voici mon code pour le découvrir:
Parce qu'avec
UIKeyboardTypeNumberPad
, l'utilisateur ne peut entrer que Number ou Backspace, donc lorsque la longueur de la chaîne est 0, il doit s'agir d'une touche de retour arrière.J'espère que ce qui précède vous aidera.
la source
Plutôt que d'essayer de préconstruire ce qui SERA dans le champ de texte ou de déterminer quel caractère spécial a été entré dans la
shouldChangeCharactersInRange
méthode, je suggérerais de faire ce qui suit:Cela vous permet d'appeler une méthode directement après la fin de l'opération en cours. Ce qui est cool à ce sujet, c'est que, au moment où il se termine, la valeur modifiée sera déjà dans le fichier
UITextField
. À ce stade, vous pouvez simplement vérifier sa longueur et / ou valider en fonction de ce qu'il y a.la source
Le sous-classement UITextField ne fonctionnait pas pour moi sur iOS 8.3, deleteBackward n'a jamais été appelé.
Voici la solution que j'ai utilisée, fonctionne sur toutes les versions d'iOS 8 et devrait également fonctionner sur d'autres versions d'iOS
la source
Dans le fichier .h, ajoutez un délégué UIKeyInput
Formatage amélioré
la source
J'ai implémenté la solution similaire avec des améliorations mineures qui me diront que si le champ de texte a une valeur alors que l'utilisateur a tapé sur le retour arrière. Ceci est utile dans mon cas lorsque je ne devrais me concentrer sur un autre champ de texte que si le champ de texte est vide lorsque vous appuyez sur Retour arrière.
la source
La réponse la plus peuplée manque une chose - la capacité de détecter si le champ de texte était vide ou non.
Autrement dit, lorsque vous remplacez la méthode deleteBackwards () d'une sous-classe TextField, vous ne savez toujours pas si le champ de texte était déjà vide. (Avant et après deleteBackwards (),
textField.text!
est une chaîne vide:""
)Voici mon amélioration, avec un contrôle de la vacuité avant la suppression.
1. Créez un protocole délégué qui étend UITextFieldDelegate
2. Sous-classe UITextField
3. Implémentez votre nouveau protocole de délégué
la source
Gestionnaire complet pour champ de texte avec numéro à un chiffre pour Swift 5.1 :
1 étape
2 étape
3 étape
la source
Voici ma solution basée sur l'idée @andrew:
quelque part, par exemple dans viewDidLoad
puis
la source
Vous pouvez vérifier le texte de la vue / du champ de texte pour voir s'il est vide et vous assurer que le texte de remplacement est également vide dans la méthode déléguée shouldChangeTextIn.
la source
Quelque chose comme ça:
bien sûr, le hachage est pour une chaîne de caractères.
la source
À l'aide de la méthode TextField Delegate:
Ajoutez le code suivant dans la méthode ci-dessus pour détecter l'événement de suppression
la source
Pour garder les choses simples, voici la seule condition que vous devez vérifier
la source
la source
Dans
UITextViewDelegate
:ça marche bien pour moi.
mise à jour pour le pinyin simplifié chinois et la saisie manuscrite chinoise:
base sur le document dit:
"Si l'utilisateur appuie sur
deleteKey
, la longueur de la plage est de 1 et un objet chaîne vide remplace ce caractère unique."la source
UITextField
, nonUITextView
.