私はこれまでUITextField
カーソルの位置を試し、どのように操作するかを試してきました。私は次のように、Objective-Cの関係をいくつか見つけました
しかし、私はSwiftを使用しているので、現在のカーソル位置を取得してSwiftで設定する方法を学びたかったのです。
以下の答えは、私の実験とObjective-Cからの翻訳の結果です。
私はこれまでUITextField
カーソルの位置を試し、どのように操作するかを試してきました。私は次のように、Objective-Cの関係をいくつか見つけました
しかし、私はSwiftを使用しているので、現在のカーソル位置を取得してSwiftで設定する方法を学びたかったのです。
以下の答えは、私の実験とObjective-Cからの翻訳の結果です。
回答:
以下の内容は、両方に適用されます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)
現在のカーソル位置の左側の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()
テキストフィールドにフォーカスを与え、キーボードが表示されるようにします。
ある範囲でテキストを取得する方法については、この回答を参照してください。
textField.endOfDocument
。アンダースコアまたはスペースを使用して、不足している文字を表すこともできます。
私の場合、DispatchQueueを使用する必要がありました。
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async{
textField.selectedTextRange = ...
}
}
これと他のスレッドからは何も機能しませんでした。
PS:すべてのUIを実行する必要があるので、textViewDidBeginEditingが実行されているスレッドとメインスレッドをダブルチェックしました。
textViewDidBeginEditing
ます。したがって、それをキューに入れることにより、発信者が終了した後に発生します。
ポイントにカーソル位置を設定するには:
textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))
カーソル位置をリセットする場合:
textView.endFloatingCursor()
注:この例は、TextviewとTextfieldの両方で機能します。