2009-03-06 5 views
23

У нас есть UITextView в нашем приложении для iPhone, которое доступно для редактирования. Нам нужно вставить какой-то текст в местоположение курсора, когда пользователи нажимают некоторые кнопки на панели инструментов, но не могут найти документально подтвержденный (или недокументированный) метод поиска текущего местоположения курсора.Получение позиции курсора в UITextView на iPhone?

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

+0

Следует отметить, что textField.selectedRange.location не вернет местоположение, если запрашивается в textViewDidBeginEditing: textField, если вы не получите его после задержки. – Morkrom

ответ

8

Вы попробовали UITextView.selectedRange? Он возвращает NSRange, чей элемент местоположения должен сказать вам, где находится курсор.

30

Как сказал дрюх, вы можете использовать выбранный Range UITextView, чтобы вернуть точку вставки. Длина этого диапазона всегда равна нулю. Пример ниже показывает, как это сделать.

NSString *contentsToAdd = @"some string"; 
NSRange cursorPosition = [tf selectedRange]; 
NSMutableString *tfContent = [[NSMutableString alloc] initWithString:[tf text]]; 
[tfContent insertString:contentsToAdd atIndex:cursorPosition.location]; 
[theTextField setText:tfContent]; 
[tfContent release]; 
+6

Обратите внимание, что с iPhone 3.0 уже не верно, что длина диапазона всегда равна нулю. Если пользователь выбрал текст, длина будет отличной от нуля. В этом случае вы можете использовать replaceCharactersInRange: withString: вместо insertString :: atIndex :. Вы также должны установить новый диапазон выбора соответствующим образом. –

+0

Это замечательно - но когда я это делаю, курсор пользователя бросается в конец UITextView. Как я могу удерживать курсор пользователя на месте? – Jason

+2

Jason, попробуйте tf.selectedRange = NSMakeRange (cursorPosition.location + contentsToAdd.length, 0); после того, как вы установили новый текст – demosten

10

Используйте UITextView selectedRange свойство, чтобы найти точку вставки, когда представление текст первого Ответчик. В противном случае, когда представление не находится в фокусе, это свойство возвращает NSNotFound. Если вам нужно знать позицию курсора в этом случае, рассмотрите подклассификацию UITextView и переопределите метод canResignFirstResponder, где вы можете сохранить позицию курсора в переменной-члене.

+0

Это отличная информация, которую легко пропустить. Я не могу сказать вам, сколько времени мне понадобилось, чтобы выяснить, почему выбранный Range.location возвращает NSNotFound. Вы можете проверить недопустимое местоположение с помощью: if (myTextField.selectedRange.location == NSNotFound) – memmons

+0

Вы решили мою жизнь! Но теперь мне интересно, что означает 'selectedTextRange'? Я всегда получаю начало всего текста при его использовании ... –

1

Swift 4:

// lets be safe, thus if-let 
if let cursorPosition = textView.selectedTextRange?.start { 
    // cursorPosition is a UITextPosition object describing position in the text 

    // if you want to know its position in textView in points: 
    let caretPositionRect = textView.caretRect(for: cursorPosition) 
} 

Мы просто используем textView.selectedTextRange, чтобы получить выбранный текст диапазон и позиция курсора находится на start положении.