Предположим, что ваш код находится в методе объекта, где self.textField
- это рассматриваемое UITextField.
Текущую позицию курсора / выделения можно найти с помощью:
NSRange range = self.textField.selectedTextRange;
Если пользователь не выделил текст, range.length
будет 0, указывая, что это просто курсор.К сожалению, это свойство не соответствует KVO, поэтому не существует эффективного способа информирования о его изменениях, однако это не должно быть проблемой в вашем случае, потому что вы, вероятно, действительно заботитесь об этом, только когда отвечаете на взаимодействие пользователя ссвою пользовательскую клавиатуру.
Вы можете затем использовать (при условии, что newText
удерживает ввод с вашей пользовательской клавиатуры).
[self.textField replaceRange:range withText:newText];
Если вам необходимо впоследствии отрегулировать курсор / выбор, вы можете использовать:
self.textField.selectedTextRange = newRange;
Например, вы можете расположить курсор после вставленного вами текста.
ОБНОВЛЕНИЕ:
В моем исходном ответеЯ не заметил, что я использовал категорию, которую я добавил к UITextView
:
- (void)setSelectedRange:(NSRange)selectedRange
{
UITextPosition* from = [self positionFromPosition:self.beginningOfDocument offset:selectedRange.location];
UITextPosition* to = [self positionFromPosition:from offset:selectedRange.length];
self.selectedTextRange = [self textRangeFromPosition:from toPosition:to];
}
- (NSRange)selectedRange
{
UITextRange* range = self.selectedTextRange;
NSInteger location = [self offsetFromPosition:self.beginningOfDocument toPosition:range.start];
NSInteger length = [self offsetFromPosition:range.start toPosition:range.end];
NSAssert(location >= 0, @"Location is valid.");
NSAssert(length >= 0, @"Length is valid.");
return NSMakeRange(location, length);
}
Затем замените использование self.textField.selectedRange
вместо self.textField.selectedTextRange
и продолжайте, как я описал.
Спасибо omz за указание на мою ошибку.
Конечно, вы можете работать напрямую с UITextRange
, но, по крайней мере, в моем случае, это оказалось довольно неуклюжим.