Управление положением курсора в UITextField - PullRequest
47 голосов
/ 30 сентября 2009

У меня есть UITextField, для которого я выполняю форматирование, изменяя текст внутри обработчика уведомлений об изменениях. Это прекрасно работает (как только я решил проблемы с повторным входом), но оставляет мне еще одну неприятную проблему. Если пользователь перемещает курсор в другое место, кроме конца строки, то мое изменение форматирования перемещает его в конец строки. Это означает, что пользователи не могут вставлять более одного символа за раз в середину текстового поля. Есть ли способ запомнить и затем сбросить положение курсора в UITextField?

Ответы [ 7 ]

66 голосов
/ 18 июля 2012

Управление позицией курсора в UITextField является сложным, потому что очень много абстракций связано с полями ввода и вычислением позиций. Тем не менее, это, безусловно, возможно. Вы можете использовать функцию-член setSelectedTextRange:

[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];

Вот функция, которая берет диапазон и выбирает тексты в этом диапазоне. Если вы просто хотите поместить курсор на определенный индекс, просто используйте диапазон длиной 0:

+ (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range {
    UITextPosition *start = [input positionFromPosition:[input beginningOfDocument] 
                                                 offset:range.location];
    UITextPosition *end = [input positionFromPosition:start
                                               offset:range.length];
    [input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
}

Например, чтобы поместить курсор на idx в UITextField input:

    [Helpers selectTextForInput:input 
                        atRange:NSMakeRange(idx, 0)];
4 голосов
/ 10 ноября 2016

Полезно для позиционирования по индексу (Swift 3)

private func setCursorPosition(input: UITextField, position: Int) {
    let position = input.position(from: input.beginningOfDocument, offset: position)!
    input.selectedTextRange = input.textRange(from: position, to: position)
}
3 голосов
/ 24 октября 2009

Я наконец-то нашел решение этой проблемы! Вы можете поместить нужный текст в системный монтажный щит, а затем вставить его в текущую позицию курсора:

[myTextField paste:self]  

Я нашел решение в блоге этого человека:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

Функциональность вставки зависит от ОС V3.0, но я проверил ее, и она отлично работает для меня с пользовательской клавиатурой.

Если вы выберете это решение, вам, вероятно, следует сохранить существующее содержимое буфера обмена пользователя и сразу же восстановить его.

2 голосов
/ 24 октября 2016

Вот версия Swift @Chris R. - обновлена ​​для Swift3

private func selectTextForInput(input: UITextField, range: NSRange) {
    let start: UITextPosition = input.position(from: input.beginningOfDocument, offset: range.location)!
    let end: UITextPosition = input.position(from: start, offset: range.length)!
    input.selectedTextRange = input.textRange(from: start, to: end)
}
1 голос
/ 27 октября 2016

Не стесняйтесь использовать эту категорию UITextField для получения и установки позиции курсора:

@interface UITextField (CursorPosition)

@property (nonatomic) NSInteger cursorPosition;

@end

-

@implementation UITextField (CursorPosition)

- (NSInteger)cursorPosition
{
    UITextRange *selectedRange = self.selectedTextRange;
    UITextPosition *textPosition = selectedRange.start;
    return [self offsetFromPosition:self.beginningOfDocument toPosition:textPosition];
}

- (void)setCursorPosition:(NSInteger)position
{
    UITextPosition *textPosition = [self positionFromPosition:self.beginningOfDocument offset:position];
    [self setSelectedTextRange:[self textRangeFromPosition:textPosition toPosition:textPosition]];
}

@end
0 голосов
/ 11 мая 2015

Вот фрагмент кода, который отлично работает для этой проблемы:

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    UITextPosition *positionBeginning = [textField beginningOfDocument];
    UITextRange *textRange =[textField textRangeFromPosition:positionBeginning 
                                                  toPosition:positionBeginning];
    [textField setSelectedTextRange:textRange];
}

Источник от @ omz

0 голосов
/ 30 сентября 2009

Я не думаю, что есть способ поместить курсор в определенное место в вашем UITextField (если только вы не стали очень хитрыми и не смоделировали событие касания). Вместо этого я бы обработал форматирование, когда пользователь закончил , редактируя свой текст (в textFieldShouldEndEditing:), и если его запись неверна, не позволяйте текстовому полю завершать редактирование.

...