Получение и установка положения курсора UITextField и UITextView в Swift


я экспериментировал с UITextField и как работать с его позиции курсора. Я нашел несколько ответов на отношение Objective-C, как в

но так как я работаю с Swift, я хотел узнать, как получить текущий курсор расположение и установить его в Swift.

ответ ниже является результатом моих экспериментов и перевода из Objective-C.

2 64

2 ответа:

этот ответ был обновлен для Swift 3

следующее содержание относится к обоим UITextField и UITextView.

полезная информация

в самом начале текстового поля text:

let startPosition: UITextPosition = textField.beginningOfDocument

в самом конце текстового поля текст:

let endPosition: UITextPosition = textField.endOfDocument

текущий выбранный диапазон:

let selectedRange: UITextRange? = textField.selectedTextRange

получить позицию курсора

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)

    print("\(cursorPosition)")
}

установить позицию курсора

In чтобы установить положение, все эти методы фактически устанавливают диапазон с одинаковыми начальными и конечными значениями.

в начало

let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)

до конца

let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)

на одну позицию слева от текущей позиции курсора

// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {

    // and only if the new position is valid
    if let newPosition = textField.position(from: selectedRange.start, offset: -1) {

        // set the new position
        textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
    }
}

в произвольное положение

начните с самого начала и переместите 5 символов на экран право.

let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {

    textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}

по теме

выделить весь текст

textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)

выберите диапазон текста

// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)

if startPosition != nil && endPosition != nil {
    textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}

вставить текст в текущую позицию курсора

textField.insertText("Hello")

Примечания

  • использовать textField.becomeFirstResponder() для фокусировки на текстовом поле и отображения клавиатуры.

  • посмотреть ответ как получить текст на некотором расстоянии.

см. также

в моем случае я должен был использовать DispatchQueue:

func textViewDidBeginEditing(_ textView: UITextView) {

   DispatchQueue.main.async{
      textField.selectedTextRange = ...
   }
}

больше ничего из этого и других потоков не работало.

PS: Я дважды проверил, какой поток выполнял textViewDidBeginEditing, и это был основной поток, так как весь пользовательский интерфейс должен работать, поэтому не уверен, почему эта небольшая задержка с использованием main.асинхронный работал.