2016-01-21 277 views
43

我一直在試驗UITextField以及如何使用它的光標位置。我發現了一些關係,Objective-C的答案,如在Swift中獲取和設置UITextField和UITextView的光標位置

但自從我與斯威夫特的工作,我想學習如何獲取當前的光標位置並將其設置在Swift中。

下面的答案是我從Objective-C進行實驗和翻譯的結果。

回答

136

這個答案已經更新了斯威夫特3

以下內容適用於UITextFieldUITextView

有用信息

文本字段中的文本的最開始的時候:

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

當textfield爲空時,是否有任何東西將光標移動到右側?我遵循你的回答,但我無法做到。 –

2

見我來說,我不得不用DispatchQueue:從這和其他線程工作

func textViewDidBeginEditing(_ textView: UITextView) { 

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

沒有別的。

PS:我重複檢查了哪個線程運行了textViewDidBeginEditing,並且它是主線程,因爲所有UI都應該運行,所以不確定爲什麼使用main.asynch這個小延遲起作用。