J'ai un UITextField que je suis en forçant la mise en forme en modifiant le texte à l'intérieur de la notification de changement de gestionnaire. Cela fonctionne très bien (une fois que j'ai résolu le réentrance des questions), mais laisse-moi avec encore un problème lancinant. Si l'utilisateur déplace le curseur à un endroit autre que la fin de la chaîne, puis ma modification de mise en forme se déplace à la fin de la chaîne. Cela signifie que les utilisateurs ne peuvent pas insérer plus d'un caractère à la fois dans le milieu de la zone de texte. Est-il un moyen de se souvenir, puis réinitialiser la position du curseur dans le UITextField?
Réponses
Trop de publicités?Le contrôle de la position du curseur dans un UITextField est compliqué, car de nombreux abstractions sont impliqués avec des zones de saisie et de calcul des positions. Cependant, il est certainement possible. Vous pouvez utiliser la fonction de membre setSelectedTextRange
:
[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
Voici une fonction qui prend une fourchette et sélectionne les textes de cette gamme. Si vous voulez juste pour placer le curseur à un certain indice, il suffit d'utiliser une gamme de longueur 0:
+ (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range {
UITextPosition *start = [input positionFromPosition:[input beginningOfDocument]
offset:range.location];
UITextPosition *end = [input positionFromPosition:start
offset:range.length];
[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
}
Par exemple, pour placer le curseur à l' idx
dans le UITextField input
:
[Helpers selectTextForInput:input
atRange:NSMakeRange(idx, 0)];
J'ai enfin trouvé une solution pour ce problème! Vous pouvez mettre le texte inséré dans le système de la table de montage, puis de le coller à la position actuelle du curseur:
[myTextField paste:self]
J'ai trouvé la solution sur son blog:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html
Le copier-coller est OS V3.0 spécifique, mais je l'ai testé et il fonctionne très bien pour moi avec un clavier personnalisé.
Je ne pense pas qu'il y est un moyen pour placer le curseur à un endroit particulier de votre UITextField
(sauf si vous avez très délicate et simulé un événement tactile). Au lieu de cela, j'avais la poignée de mise en forme lorsque l'utilisateur a terminé l'édition de leurs textes (en textFieldShouldEndEditing:
) et si leur saisie est erronée, ne laissez pas le champ de texte pour terminer la modification.