Подтвердить что ты не робот

Получение позиции курсора 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. Как это найти?

4b9b3361

Ответ 1

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)];
    }
}

Ответ 2

Быстрая версия

if let selectedRange = textField.selectedTextRange {

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

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

Ответ 3

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

- (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.

Ответ 4

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

Вы можете установить заполнение курсора путем создания подкласса класса 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))
}