Получение и установка положения курсора UITextField и UITextView в Swift
я экспериментировал с UITextField
и как работать с его позиции курсора. Я нашел несколько ответов на отношение Objective-C, как в
- получение позиции курсора UITextField в ios
- управление положением курсора в UITextField
- UITextField get currently edited word
но так как я работаю с Swift, я хотел узнать, как получить текущий курсор расположение и установить его в Swift.
ответ ниже является результатом моих экспериментов и перевода из Objective-C.
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.асинхронный работал.