Position du curseur de contrôle dans UITextField

j'ai un UITextField que je force à formater en modifiant le texte à l'intérieur du gestionnaire de notification de changement. Cela fonctionne très bien (une fois que j'ai résolu les problèmes de réintégration) mais me laisse avec un problème plus lancinant. Si l'utilisateur déplace le curseur ailleurs que la fin de la chaîne, alors mon changement de formatage le déplace vers 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 du champ de texte. Est-il un moyen de se souvenir et de puis réinitialiser la position du curseur dans le UITextField ?

47
demandé sur Alex Cio 2009-09-30 23:37:22

7 réponses

contrôler la position du curseur dans un champ Uitext est compliqué parce que tant d'abstractions sont impliquées avec les boîtes d'entrée et les positions de calcul. Cependant, c'est certainement possible. Vous pouvez utiliser la fonction 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 placer le curseur à un certain index, il suffit d'utiliser une plage 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]];
}

pour exemple, pour placer le curseur à idx dans le champ Uitext input :

    [Helpers selectTextForInput:input 
                        atRange:NSMakeRange(idx, 0)];
66
répondu Chris R 2012-07-18 00:26:10

utile pour se positionner à l'index (Swift 3)

private func setCursorPosition(input: UITextField, position: Int) {
    let position = input.position(from: input.beginningOfDocument, offset: position)!
    input.selectedTextRange = input.textRange(from: position, to: position)
}
4
répondu George Muntean 2016-11-10 13:07:58

j'ai enfin trouvé une solution à ce problème! Vous pouvez mettre le texte dont vous avez besoin insérés dans le système pasteboard et ensuite le coller à la position courante du curseur:

[myTextField paste:self]  

j'ai trouvé la solution sur le blog de cette personne:

http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

la fonctionnalité de la pâte est OS V3.0 spécifique, mais je l'ai testé et il fonctionne très bien pour moi avec un clavier personnalisé.

si vous optez pour cette solution, vous devriez probablement sauvegarder le contenu existant du presse-papiers de l'utilisateur et le restaurer immédiatement après.

3
répondu Dan J 2015-10-28 20:41:11

Voici la version Swift de @Chris R. – mise à jour pour Swift3

private func selectTextForInput(input: UITextField, range: NSRange) {
    let start: UITextPosition = input.position(from: input.beginningOfDocument, offset: range.location)!
    let end: UITextPosition = input.position(from: start, offset: range.length)!
    input.selectedTextRange = input.textRange(from: start, to: end)
}
2
répondu gabuchan 2016-10-24 13:08:02

Je ne pense pas qu'il y ait un moyen de placer le curseur à un endroit particulier dans votre UITextField (à moins que vous avez eu très délicat et simulé un événement de toucher). Au lieu de cela, je m'occuperais du formatage quand l'Utilisateur a fini éditant leur texte (dans textFieldShouldEndEditing: ) et si leur entrée est incorrecte, ne laissez pas le champ de texte pour finir l'édition.

0
répondu pix0r 2009-09-30 19:43:34

N'hésitez pas à utiliser cette catégorie UITextField pour obtenir et régler la position du curseur:

@interface UITextField (CursorPosition)

@property (nonatomic) NSInteger cursorPosition;

@end

@implementation UITextField (CursorPosition)

- (NSInteger)cursorPosition
{
    UITextRange *selectedRange = self.selectedTextRange;
    UITextPosition *textPosition = selectedRange.start;
    return [self offsetFromPosition:self.beginningOfDocument toPosition:textPosition];
}

- (void)setCursorPosition:(NSInteger)position
{
    UITextPosition *textPosition = [self positionFromPosition:self.beginningOfDocument offset:position];
    [self setSelectedTextRange:[self textRangeFromPosition:textPosition toPosition:textPosition]];
}

@end
0
répondu Pavel Alexeev 2016-10-28 11:52:41

voici un extrait qui fonctionne très bien pour ce problème:

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    UITextPosition *positionBeginning = [textField beginningOfDocument];
    UITextRange *textRange =[textField textRangeFromPosition:positionBeginning 
                                                  toPosition:positionBeginning];
    [textField setSelectedTextRange:textRange];
}

Source de @omz

-2
répondu Alex Cio 2017-05-23 12:13:54