2009-09-30 3 views
45

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

+3

Быстрый ответ о получении и установке положения курсора и вставке текста. http://stackoverflow.com/a/34922332/3681880 – Suragch

ответ

0

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

+3

Я подумал об этом, но то, что я реализую, похоже на то, как вы вводите числа в банкомате. Десятичная цифра всегда есть, и когда вы вводите числа, они перемещаются влево, поэтому сначала вводятся результаты 1-0-5-0 в 0,01, затем 0,10, 1,05, 10,50. Чтобы сделать это в конце, вы получите 1050 в поле, а затем измените его на 10.50, что довольно смущает пользователя. – Jeremy

3

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

[myTextField paste:self] 

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

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

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

+1

Это должен быть принятый ответ. – banDedo

+13

Изменить буфер обмена пользователя? Это похоже на что-то, что меня задело бы. Можете ли вы восстановить буфер обмена, когда закончите с ним? – colinta

64

Управление позицией курсора в 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)]; 
+0

Молодцы. это работает для меня и является гибким. – LostInTheTrees

+0

Общая идея в порядке, но этот код хочет находиться в категории на NSTextField, например здесь: https://github.com/MaxZeng/UITextField-SelectedRange/blob/master/UITextFieldSelectedRange/UITextField%2BSelection.m – osxdirk

+1

Извините, но он не работает, курсор остается в конце ... iOS 8.0 здесь. –

-2

Здесь отрывок, который прекрасно работает для этой проблемы:

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

Source from @omz

2

Вот быстрая версия @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) 
} 
0

Не стесняйтесь использовать эту 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 
4

Полезная на позицию в индексе (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) 
} 
Смежные вопросы