獲取和設定游標位置

有用的資訊

文字欄位文字的開頭:

let startPosition: UITextPosition = textField.beginningOfDocument

文字欄位文字的最後:

let endPosition: UITextPosition = textField.endOfDocument

當前選擇的範圍:

let selectedRange: UITextRange? = textField.selectedTextRange

獲取游標位置

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

設定游標位置

為了設定位置,所有這些方法實際上都設定了具有相同開始值和結束值的範圍。

到了開始

let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition)

到最後

let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: 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.positionFromPosition(selectedRange.start, inDirection: UITextLayoutDirection.Left, offset: 1) {
        
        // set the new position
        textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition)
    }
}

到任意位置

從頭開始,向右移動 5 個字元。

let arbitraryValue: Int = 5
if let newPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) {
    
    textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition)
}

有關

選擇所有文字

textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)

選擇一系列文字

// Range: 3 to 7
let startPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 3)
let endPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 7)

if startPosition != nil && endPosition != nil {
    textField.selectedTextRange = textField.textRangeFromPosition(startPosition!, toPosition: endPosition!)
}

在當前游標位置插入文字

textField.insertText("Hello")

筆記

  • 此示例最初來自此 Stack Overflow 答案

  • 這個答案使用文字欄位,但相同的概念適用於 UITextView

  • 使用 textField.becomeFirstResponder() 將焦點置於文字欄位並使鍵盤顯示。

  • 有關如何在某個範圍內獲取文字,請參閱此答案

有關