web-dev-qa-db-ja.com

SwiftでのUITextFieldおよびUITextViewのカーソル位置の取得と設定

私はUITextFieldを試し、そのカーソル位置をどのように扱うかを試してきました。以下のように、Objective-Cの多くの関係を見つけました。

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

以下の答えは、Objective-Cからの実験と翻訳の結果です。

87
Suragch

次の内容は、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()を使用して、テキストフィールドにフォーカスを置き、キーボードを表示します。

  • 特定の範囲でテキストを取得する方法については、 この回答 を参照してください。

こちらもご覧ください

247
Suragch

私の場合、DispatchQueueを使用する必要がありました。

func textViewDidBeginEditing(_ textView: UITextView) {

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

これと他のスレッドからは何も機能しませんでした。

PS:textViewDidBeginEditingが実行されているスレッドをダブルチェックしました。すべてのUIが実行されるはずなので、メインスレッドでした。

21
Michael Ros

ポイントにカーソル位置を設定するには:

textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))

カーソル位置をリセットする場合:

textView.endFloatingCursor()

:この例は、TextviewとTextfieldの両方で機能します。

1
Parth Patel
let range = field.selectedTextRange

field.text = "hello world"

field.selectedTextRange = range 
0
Ivan