[SwiftUI][Xcode]文字入力欄を作る「TextField」の使い方

SwiftUI

「文字入力欄を作りたい」

「TextFieldってどうやって使えばいいの?」

「TextFieldって何?」

と言う人に向けて、この記事は書かれています。

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

iOSアプリでは、ユーザに文字を入力してもらいたい場面というのがありますよね。

SwiftUIでは、TextFieldという文字入力欄のビューが用意されています。

この記事では、TexFieldビューの使い方を解説します。

スポンサーリンク

TextFieldビュー

イニシャライザ

TextFieldのイニシャライザは、次のようになっています。

init(_ titleKey: ,
       _ text: Binding<String>,
       onEditingChanged: @escaping(Bool) -> Void ={ _ in},
       onCommit: @escaping() -> Void = {})

引数については以下の通りです。

  1. titleKey
    プレースホルダー(入力されていない時に表示される文字列)
  2. text
    入力するテキスト。文字列が変更されるので、状態変数のバインディング($)を渡す
  3. onEditingChanged(クロージャー)
    テキストの入力開始・終了時の処理
    テキストが入力中の時にtrue、それ以外でfalseがアンダーライン(_)に格納される
  4. onCommit(クロージャー)
    エンターキーを押した時に行う処理

.textFieldStyleモディファイア

TextFileldは、デフォルトでは枠線がなく、ちょっと見にくいです。

そこで、.textFieldStyleモディファイアを使うことによって、枠線をつけることが出来ます。

.textFieldStyleモディファイアには、

PlainTextFieldStyleとRoundedBorderTextFieldStyleの2つが使えます。

Plainの方は、枠線が付かずデフォルトと変わりません。

なので、枠線をつけたい場合は、RoundedBorderFieldStyleを使います

        TextField("文字を入力してください", text: $input,
                  onEditingChanged: { _ in
                    //入力開始時の処理
                  },
                  onCommit: {
                    //エンター機を押した時の処理
                  })
            .padding()
            .textFieldStyle(RoundedBorderTextFieldStyle())

textFieldStyleでは、枠線の太さや角の丸みを設定したりは出来ないです。

使用例

名前入力欄の例を紹介します。

    @State var input = ""
    @State var onEdit = false
    @State var endIn = ""
    var body: some View {
        VStack {
            TextField("名前を入力してください", text: $input,
                      onEditingChanged: { isEdit in
                        if isEdit {
                            //入力開始処理
                            input = ""
                            self.onEdit = true
                        } else {
                            //入力終了処理
                            self.onEdit = false
                        }
                      },
                      onCommit: {
                        //エンターキーを押した時の処理
                        self.endIn = "入力完了"
                      })
                .padding()
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .shadow(color: onEdit ? .blue : .clear, radius: 3)
            
            Text(endIn)
        }
 }

onEditingChangedのisEditで、テキストが入力し始めたかどうかを判定している。

入力し始めた時、onEditをtrueにし、TextFieldに影をつけ、入力中であることが分かりやすいようにしています。

また、入力が終了した時、onEditをFalseにし、影がなくなるようにしています。

エンターキーを入力すると、endInに「入力完了」という文字が代入されます。

まとめ

  • TextFieldによって、ユーザーに入力をしてもらえる
  • イニシャライザは、titleKey(プレースホルダー)、text(入力される文字列)、onEditingChanged(入力開始時・終了時の処理)、onCommit(エンターキーを押した時の処理)の4つが引数
  • 枠線をつけたいときは、textFieldStyleモディファイアのRoundedBorderTextFieldStyleを使う

合わせて読みたい記事

コメント

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