Comment détecter la touche suppr sur un UITextField dans iOS 8?
J'ai sous-classé UITextField et mis en œuvre le UIKeyInput du protocole de deleteBackward méthode pour détecter la touche retour arrière d'être pressé. Cela fonctionne très bien sur iOS 7, mais pas sur iOS 8.
deleteBackward n'est pas appelée sur l'objet UITextField plus lorsque j'appuie sur la touche retour arrière.
J'ai vérifié la documentation et les notes de version et rien n'indique la raison pour laquelle cela pourrait se produire. Les pointeurs?
- Gardez un oeil sur cette question - semble se demander la même chose.
- Merci @thegrinner
InformationsquelleAutor VNVN | 2014-08-18
Vous devez vous connecter pour publier un commentaire.
Vous devez regarder un exemple pour MBContactPicker sur github. Suppression de contacts à MBContactPicker via la touche retour arrière sur iOS8 testé par moi. Et il travaille beaucoup! Vous pouvez utiliser le son comme exemple.
Auteur de MBContactPicker utiliser la méthode suivante: Lorsque UITextField doit devenir vide (ou avant l'appel becomeFirstResponder quand il est vide), il sauve unique espaces symbole il. Et puis, quand vous appuyez sur la touche retour arrière (lorsque la mise au point a été fixée à la fin du texte de votre UITextField), la méthode
fonctionne. A l'intérieur vous devez utiliser la case comme ceci:
Donc, vous devez toujours contrôler que UITextField contient des espaces.
Ce n'est pas hack. Ainsi, l'utilisateur willn'pas remarqué à propos de certains comportements a été changé
Beaucoup de gens ont été dire que c'est un bug, mais que ce problème existe toujours dans le GM, je commence à penser qu'il pourrait être un changement dans la logique. Cela dit, j'ai écrit ce morceau de code pour mon application et l'ai testé sur iOS 7-8.
Ajoutez la méthode suivante à votre
UITextField
sous-classe.Ce code est légèrement en avant de la ligne rouge de l'API privée, mais vous ne devriez avoir aucun problème à l'utiliser. Mon application de ce code est dans l'app store.
Pour expliquer un peu, ont été l'appel de la super mise en œuvre de cette méthode pour éviter de perdre de code. Après allaient
-deleteBackward
si il n'y a pas de texte et la version iOS est entre 8-8.2.MODIFIER: 1/22/15
Il peut également être utile à la sous-classe le
-deleteBackward
méthode de votre sous-classéUITextField
. Cette version corrige quelques conditionnelle de bugs. Un être si vous utilisez un clavier personnalisé. Heres un exemple de la méthode.MODIFIER: 4/13/15
Comme @Gee.E commenté, iOS 8.3 a résolu ce problème. Le code a été mis à jour pour refléter les modifications.
![textField.text length]
à(![textField.text length] || shouldDelete)
. Ce n'est pas nécessaire parce que iOS8-keyboardInputShouldDelete:
a été supprimée, de sorte que la valeur deshouldDelete
est toujours égale àYES
. Aussi, si pour certaines raisons, cette méthode ont été pour réapparaître dans le futur,-deleteBackward
serait appelé à deux reprises, une fois en mode natif et une fois à partir de ce code.-textField:shouldChangeCharactersInRange:replacementString:
vous pouvez vérifier si la chaîne vide a été supprimé comme ça,if ([string isEqualToString:@""] && NSEqualRanges(range, NSMakeRange(0, 0))) { }
.-deleteBackward
. Malade de mise à jour de la réponse avec ce que j'utilise dans mon application.![textField.text length]
ne devrait pas être changé (textField.longueur du texte]?[super deleteBackward]
, parce quedeleteBackward
serait appelé deux fois. Je ne peux pas trouver toute la documentation qui sous-classedeleteBackward
doit appeler[super deleteBackward]
.textField
n'a pas de texte et que l'utilisateur tente encore de les supprimer. Donc, si vous souhaitez garder à la fonctionnalité native ensuite utiliser![textField.text length]
. Vous pouvez supprimer[super deletebackward]
si vous choisissez, mais j'ai appris à ne pas appeler super ne paie pas pour une ligne de vous enregistrer.Remove the character just before the cursor from your class’s backing store and redisplay the text.
Il semble quedeletebackward
est appelée si le champ contient du texte ou n'a pas de texte.![textField.text length]
est parce que iOS appels-deleteBackward
sur son propre. Donc, nous allons appeler cette méthode lorsque iOS n'est pas l'appeler. Ce qui est quand il n'y a pas de texte et que l'utilisateur a toujours la suppression et nous sommes sous iOS8.-deleteBackward
appel entrant arrive maintenant (sans le code de cette réponse)Vous pouvez détecter lorsque l'utilisateur supprime le texte à l'aide de la touche retour arrière par la mise en œuvre de UITextField délégué méthode:
Dans iOS8, quelques claviers supprimer le mot entier, de sorte que seule case à la chaîne.la longueur est OK.
Swift 2.2:
Swift version 2.0 pour la Détection de la touche retour arrière en fonction de suppression, référencement du code poste de almas
string.isEmpty
est la bonne façon de tester pour la suppression, maisrange.length == 1
est faux. Si l'utilisateur a un tas de texte sélectionné et frappe supprimer la longueur de la gamme sera plus grande que 1, comme ils sont de la suppression de plusieurs personnages.Ce n'est pas explicitement de répondre à la question d'origine, mais ne vaut que dans la documentation de
textField(_:shouldChangeCharactersIn:replacementString:)
, il dit:"
string
: La chaîne de remplacement pour la gamme spécifiée. Lors de la frappe, ce paramètre ne contient normalement que le seul nouveau personnage qui a été tapé, mais il peut contenir des caractères, si l'utilisateur est de coller le texte. Lorsque l'utilisateur supprime un ou plusieurs caractères, la chaîne de remplacement est vide."Ainsi, nous pouvons détecter correction arrière dans un
UITextFieldDelegate
si nous mettons en œuvretextField(_:shouldChangeCharactersIn:replacementString:)
et de vérifier si la longueur destring
est de 0.Beaucoup d'autres réponses ici ont utilisé cette même logique sans faire référence à la documentation en espérant arriver directement à partir de la source qui rend les gens plus à l'aise avec elle.
Fondamentalement, cette méthode détecte le bouton sur lequel vous appuyez sur (ou ont juste pressé). Cette entrée est un NSString. Nous convertir cette NSString à C de type char et de le comparer à la traditionnelle caractère de retour arrière (\b). Alors si cette strcmp est égale à -8, on peut le détecter comme un retour arrière.
swift 2:
vous devez utiliser comme cette
string.characters.count