Как установить положение курсора в UITextView - PullRequest
29 голосов
/ 17 января 2012

У меня в приложении для iPhone есть UITextView, которое можно редактировать.

Новая кнопка создается внутри UITextView всякий раз, когда пользователь выбирает определенную функцию.

Поскольку кнопка всегда расположена слева в текстовом представлении, мне нужно расположить курсор справа от кнопки, чтобы пользователь мог видеть, что он печатает.Кажется, я не могу найти документированный (или недокументированный) метод установки местоположения курсора.

У кого-нибудь есть идеи или кто-то еще достиг чего-либо подобного?

Ответы [ 6 ]

52 голосов
/ 03 сентября 2012

Я знаю, что это ОЧЕНЬ поздно, но я думал, что смогу помочь людям, застрявшим в этом (как я).

Кажется, что performSelector:withObject:afterDelay работает нормально (другие ответы просто не работают по какой-то странной причине):

- (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); 
} 

источник: http://puppenspieler.tumblr.com/post/757819650/set-selectedrange-in-a-uitextview

21 голосов
/ 17 января 2012
textView.editable = YES;
textView.selectedRange = NSMakeRange(2, 0);

Установите selectedRange в местоположение с длиной 0, и вы, вероятно, также хотите, чтобы textView был редактируемым, поэтому также установите его в YES.

17 голосов
/ 05 декабря 2014

Попробуйте что-то вроде этого:

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

Это приведет к выполнению selectedRange в главном потоке в начале следующего цикла выполнения.

5 голосов
/ 29 июня 2017

Я использую следующее, чтобы перейти к началу textView, используя Swift 4 :

DispatchQueue.main.async {
    self.selectedTextRange = self.textRange(from: self.beginningOfDocument, to: self.beginningOfDocument)
}
3 голосов
/ 17 января 2012

изменить selectedRange вашего textView.например, чтобы поместить курсор в позицию 3:

[textView setSelectedRange:NSMakeRange(3, 0)];

В вашем случае добавление некоторых пробелов в содержимое textView может помочь.и наблюдатель textview 's textDidChanged event для предотвращения этих мест будет удален пользователем.

0 голосов
/ 13 мая 2016

Если вы хотите, чтобы заполнитель Texview был обязательным или необязательным, как я.Смотрите мой хак

 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//
        }
      }

Не забудьте зарегистрировать делегата: UITextViewDelegate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...