47 votes

Contrôle de la position du curseur dans la UITextField

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?

66voto

Chris R Points 1444

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)];

3voto

Dan J Points 7314

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é.

0voto

pix0r Points 17854

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.

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