Расположение курсора в поле uitextfield - PullRequest
3 голосов
/ 06 мая 2010

я использую customkeyboard в моем контроллере. но как получить расположение курсора в uitextfiled. мое требование состоит в том, чтобы ввести символ в нужном месте текстового поля. Является ли это возможным?

Ответы [ 3 ]

1 голос
/ 03 апреля 2013

Предположим, что ваш код находится в методе объекта, где 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, но, по крайней мере, в моем случае, это оказалось довольно неуклюжим.

0 голосов
/ 21 января 2016

Swift

Получить местоположение курсора:

if let selectedRange = textField.selectedTextRange {
    let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start)
}

Введите текст в произвольном месте:

let arbitraryValue: Int = 5
if let newPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) {

    textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition)
    textField.insertText("Hello")
}

Мой полный ответ здесь .

0 голосов
/ 10 августа 2012

Ответ в том, что вы не можете получить текущее местоположение курсора для всех типов редактирования, которые могут быть выполнены с текстовым полем. Вы можете вставлять символы в курсор с помощью [textField paste], но пользователь может перемещать курсор, выделять и изменять текст, не получая уведомления о том, где находится курсор.

Вы можете временно вставить специальный символ и найти его положение в строке, удалить его, а затем добавить символ, который вы хотите иметь там.

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