2016-01-21 2 views
43

Я экспериментировал с UITextField и как работать с его позицией курсора. Я нашел несколько ответов реляционных Objective-C, как и вПолучение и настройка положения курсора UITextField и UITextView в Swift

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

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

ответ

136

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

Следующая информация относится как к UITextField и UITextView.

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

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

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)") 
} 

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

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

К началу

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!) 
} 

Вставить текст в текущей курсора Positio п

textField.insertText("Hello") 

Примечания

  • textField.becomeFirstResponder() Используйте, чтобы передать фокус в текстовое поле и сделать клавиатуру появляются.

  • См. this answer, как получить текст в каком-либо диапазоне.

Смотрите также

+0

Какова цель startPosition? Что ты можешь сделать с этим? И какова цель, которая может потребоваться для получения позиции курсора? – Honey

+1

@Honey, я использовал это имя переменной для обозначения двух разных вещей здесь. Первый - это ссылка на начало текстового поля. Было бы полезно, если бы вы хотели переместить туда курсор. Второе - это обращение к попрошайничеству выбранного диапазона текста. Это полезно, если вы хотите скопировать этот диапазон или установить на нем некоторый атрибут. – Suragch

+0

Есть ли что-нибудь, чтобы переместить курсор вправо, пока текстовое поле пуст? Я последовал твоему ответу, но я не мог этого сделать. –

2

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

func textViewDidBeginEditing(_ textView: UITextView) { 

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^