web-dev-qa-db-fra.com

Comment définir la position du curseur dans UITextView

J'ai une UITextView dans mon application iPhone qui est modifiable. 

Un nouveau bouton est créé dans UITextView chaque fois que l'utilisateur sélectionne une fonction spécifique. 

Comme le bouton est toujours placé à gauche dans la vue texte, je dois positionner le curseur sur le côté droit du bouton afin que l'utilisateur puisse voir ce qu'il tape .. (ou non documentée) pour définir l'emplacement du curseur.

Quelqu'un a-t-il des idées ou quelqu'un d'autre a-t-il réalisé quelque chose de similaire?

29
GURU

Je sais que c'est très tard, mais je pensais pouvoir aider les gens coincés dans cette affaire (comme moi).

Le performSelector:withObject:afterDelay semble bien fonctionner (les autres réponses ne fonctionneraient tout simplement pas pour une raison étrange):

- (void)textViewDidBeginEditing:(UITextView *)inView 
{ 
[self performSelector:@selector(setCursorToBeginning:) withObject:inView afterDelay:0.01]; 
} 

- (void)setCursorToBeginning:(UITextView *)inView 
{ 
//you can change first parameter in NSMakeRange to wherever you want the cursor to move
inView.selectedRange = NSMakeRange(3, 0); 
} 

source: http://puppenspieler.tumblr.com/post/757819650/set-selectedrange-in-a-uitextview

52
Cashew
textView.editable = YES;
textView.selectedRange = NSMakeRange(2, 0);

Définissez selectedRange sur un emplacement de longueur 0 et vous souhaiterez probablement aussi que textView soit éditable; définissez-le également sur YES.

21
Evan

Essayez quelque chose comme ça:

dispatch_async(dispatch_get_main_queue(), ^{
    inView.selectedRange = NSMakeRange(3, 0);
});

Cela fera que selectedRange sera exécuté sur le thread principal au début du prochain cycle d'exécution.

17
acavanagh

J'utilise ce qui suit pour aller au début de textView en utilisant Swift 4 :

DispatchQueue.main.async {
    self.selectedTextRange = self.textRange(from: self.beginningOfDocument, to: self.beginningOfDocument)
}
4
blwinters

Si vous voulez que Textview, l’espace réservé soit obligatoire ou facultatif, comme moi. Voir mon hack 

 func textViewDidBeginEditing(textView: UITextView) {
        if textView.text.isEmpty {
          if self.text == "Required" || self.text == "Optional" {
            dispatch_async(dispatch_get_main_queue(), {
              textView.selectedRange = NSMakeRange(0, 0)
            });
          }
        }
      }

      func textViewDidEndEditing(textView: UITextView) {
        if CommonUtils.isEmptyString(textView.text) {
          if required {
            textView.text = "Required"
          } else {
            textView.text = "Optional"
          }
          textView.textColor = grayColor//
        }
      }

      func textViewDidChange(textView: UITextView) {
        if textView.text.isEmpty {
          if required {
            textView.text = "Required"
          } else {
            textView.text = "Optional"
          }
          textView.textColor = grayColor
          textView.selectedRange = NSMakeRange(0, 0)
        } else {
          if required {
            if textView.text.length > "Required".length {
              textView.text = self.text.replace("Required", withString: "")
            }
          } else {
            if textView.text.length > "Optional".length {
              textView.text = self.text.replace("Optional", withString: "")
            }
          }
          textView.textColor = blackColor//
        }
      }

N'oubliez pas d'inscrire un délégué: UITextViewDelegate

0
Rico Nguyen