⌨️
【SwiftUI】TextFieldの選択状態をTextSelectionで取得
TextSelection
TextField
(TextEditor
)で、ユーザーが選択したテキストを操作したり管理する方法が追加されました。(SecureField
はサポート無さそう)
新しく追加されたTextSelection
でTextField
での選択状態をプログラムからアクセスできるようになります。
public struct TextSelection : Equatable, Hashable { ... }
使い方
TextField
のイニシャライザにselection: Binding<TextSelection>
を渡すことで、ダブルタップ等で選択したテキストの範囲等が含まれるTextSelection
を取得できます。
ドキュメント:init(_:text:selection:prompt:axis:)
@State private var text = ""
@State private var selection: TextSelection?
var body: some View {
VStack {
TextField("name", text: $text, selection: $selection)
TextEditor(text: $text, selection: $selection)
}
}
TextEditor での使用
同様に、TextEditor
でも選択状態を管理できます。
TextEditor(text: $text, selection: $selection)
サンプル
選択されたテキスト(selectedText
)を取得するには、TextSelection.Indices
経由で取得します。
struct SimpleTextEditor: View {
@State private var text: String = ""
@State private var selection: TextSelection?
var body: some View {
VStack {
TextField("name", text: $text, selection: $selection)
if let selection,
let selectedText = getSelectedText(selection: selection) {
Text("Selected Text: \(selectedText)")
}
}
}
private func getSelectedText(selection: TextSelection) -> String? {
switch selection.indices {
case .selection(let range):
return String(text[range])
case .multiSelection(let rangeSet):
let selected = rangeSet.ranges.map { String(text[$0]) }.joined(separator: ", ")
return selected.isEmpty ? nil : selected
}
}
}
参考リンク
Discussion