[SwiftUI]TextFieldのフォーカス時に文字を全て選択するには?

SwiftUI

どうも、ちょげ(@chogetarou)です。

TextFieldがフォーカスされた際に、入力されている文字を全て選択されている状態にする方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

TextFieldのフォーカス時に文字を全て選択するには、onReceiveを使います。

まず、Combineをインポートします。

import Combine

次に、TextFieldにonReceiveを付与します。

そして、onReceiveがフォーカスを検知するようにします。

TextField("Your Text Here", text: $text)
    //フォーカスを検知するonReceive
    .onReceive(NotificationCenter.default.publisher(for: UITextField.textDidBeginEditingNotification)){ obj in

        }
    }

最後に、publisherのクロージャーに、TextFieldのテキストを全て選択する処理を追加します。

TextField("Your Text Here", text: $text)
    .onReceive(NotificationCenter.default.publisher(for: UITextField.textDidBeginEditingNotification)){ obj in
        //テキストを全て選択する処理
        if let textField = obj.object as? UITextField {
            textField.selectedTextRange = textField.textRange(
                from: textField.beginningOfDocument,
                to: textField.endOfDocument
            )
        }

    }

これでTextFieldのフォーカス時に文字を全て選択状態にすることができます。

使用例

以下は、使用例です。

import SwiftUI
import Combine

struct ContentView: View {
    @FocusState var selectState: Bool
    @State var text = ""
    var body: some View {
        VStack {
            TextField("Your Text Here", text: $text)
                .onReceive(NotificationCenter.default.publisher(for: UITextField.textDidBeginEditingNotification)){ obj in
                    if let textField = obj.object as? UITextField {
                        textField.selectedTextRange = textField.textRange(
                            from: textField.beginningOfDocument,
                            to: textField.endOfDocument
                    )
                }
            }
            .padding()
        }
            
    }
    
}

コメント

タイトルとURLをコピーしました