1. ホーム
  2. ios

[解決済み] SwiftでUITextFieldとUITextViewのカーソル位置の取得と設定

2022-05-14 14:40:43

質問

私はこれまで UITextField とそのカーソル位置で動作する方法について実験しています。私は、以下のような多くの関連するObjective-Cの答えを見つけました。

しかし、私はSwiftで作業しているので、Swiftで現在のカーソル位置を取得し、またそれを設定する方法を学びたかったのです。

以下の回答は、私が実験し、Objective-Cから翻訳した結果です。

どのように解決するのですか?

以下の内容は 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)

現在のカーソル位置から1つ左の位置へ

// 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() を使って、テキストフィールドにフォーカスを与え、キーボードを表示させます。

  • 参照 この回答 を参照してください。

参照