Получение позиции курсора UITextField в ios

Я пытаюсь контролировать положение курсора в UITextField. Пользователи не могут вставлять более одного символа за раз в середину текстового поля. Он перемещает его в конец текстового поля. Так что этот пост в SO: Управление положением курсора в UITextField Это решает мою проблему. Но мне нужно знать текущую позицию курсора.

Мой код выглядит так:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
     [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
   }
}

Это дает мне ошибку в idx. Как мне найти это?

3 ответа

Решение

UITextField соответствует UITextInput протокол, который имеет методы для получения текущего выбора. Но методы сложны. Вам нужно что-то вроде этого:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField.tag == 201) {
        UITextRange *selRange = textField.selectedTextRange;
        UITextPosition *selStartPos = selRange.start;
        NSInteger idx = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selStartPos];

        [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
    }
}

Swift версия

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start)
    print("\(cursorPosition)")
}

Мой полный ответ о получении и установке позиции курсора здесь.

Размещенный вами код не будет работать для определения, где находится курсор. Вам нужен метод get, а не set. Это должно быть что-то вроде:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
         UITextRange selectedRange = [textField selectedTextRange];
         // here you will have to check whether the user has actually selected something
         if (selectedRange.empty) {
              // Cursor is at selectedRange.start
              ...
         } else {
              // You have not specified home to handle the situation where the user has selected some text, but you can use the selected range and the textField selectionAffinity to assume cursor is on the left edge of the selected range or the other
              ...
         }
   }
}

Для получения дополнительной информации - проверьте протокол UITextInput http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput

Обновление: @rmaddy опубликовал несколько хороших дополнительных битов, которые я пропустил в своем ответе - как обработать текстовую позицию из NSTextRange и преобразовать NSTextPosition в int.

Быстрое решение.

Вы можете установить заполнение курсора путем создания подкласса класса UITextfield и реализации этих двух методов.

Надеюсь, это поможет кому-то нуждающемуся.

override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.inset(by: UIEdgeInsets.init(top: 4, left: 40, bottom: 1, right: 15))
}

override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.inset(by: UIEdgeInsets.init(top: 4, left: 40, bottom: 1, right: 15))
}
Другие вопросы по тегам