テキストを入力できるようにする
ユーザーがテキストを入力できるようにするには、TextField
というViewを使用します。TextField
にも、さまざまな値を設定できる形式のものがありますが、今回は次のものを使用します。
TextField(titleKey:, text:, axis: )
-
titleKey
には、このTextField
の目的を入力します。また、文字が入力されていない状態では、そのtitleKey
の値が画面上に表示されます -
text: 入力されたテキストを保持するため、
String
型の変数を渡します - axis: テキストが利用可能なスペースに収まらない場合に、どの方向にスクロールするかを指定するものです
実際にコードを変更して動きを確認してみましょう。
struct ComplaintView: View { @State private var isPresented = false // ここを追加↓ @State private var inputText = "" var body: some View { VStack { HStack(spacing: 16) { Text("Good") Text("Chill") .foregroundStyle(.yellow) } .font(.system(size: 56)) .fontWeight(.black) .foregroundStyle(.red) Button(action: { isPresented = true }, label: { Text("愚痴る") .font(.largeTitle) .padding() }) .buttonStyle(.borderedProminent) .buttonBorderShape(.capsule) .padding(.top, 40) } .sheet(isPresented: $isPresented, onDismiss: { // 画面を閉じた時に実行する処理 }, content: { VStack { // ここを変更↓ TextField("愚痴る", text: $inputText, axis: .vertical) } }) } }
変更した箇所は2箇所です。
-
入力したテキストを管理するための
@State
変数のinputText
を追加 -
TextField
を追加
変更することで、以下のような動きが加わります。
- 入力文字がない時は愚痴るという文字が表示されます。
-
text: ここでも
$inputText
でバインディングの$
が使用されており、テキストの入力の値を変数inputText
に反映するために使われています。 -
axis: 入力された文字が画面スペースいっぱいになった場合は、
.vertical
(垂直方向)にスクロールできるように指定しています。
プレビュー上では、愚痴るボタンを押すと愚痴る
というテキストがグレー色の文字で表示されます。

その愚痴る
の部分をタップするとテキストの入力ができるようになります。

Enterを押してしまうと入力したテキストが消えてしまいますが、iOS シミュレータでは正常に動作することが確認できます。
iOSシミュレーターでの動作確認は、MyAppCollectionApp
のView
を書き換えてビルドを実行してみて下さい。
@main struct MyAppCollectionApp: App { var body: some Scene { WindowGroup { // ここを変更↓ ComplaintView() } } }
画面を閉じた時に処理を実行する
今のこのアプリの動きでは、愚痴を入力した後にsheet
で表示した画面を閉じても入力したテキストは消えません。これだと愚痴を吐き出した後に誰かに見られてしまう危険性があります。これは今すぐ、sheet
で表示した画面を閉じた時にテキストを空にした方が良さそうです。次のようにコードを変更します。
.sheet(isPresented: $isPresented, onDismiss: { // ここを追加↓ inputText = "" }, content: { VStack { TextField("愚痴る", text: $inputText, axis: .vertical) } })
これでsheet
で表示した画面が閉じると、テキストが空になり、他の方に吐き出した後の愚痴を見られる心配がなくなりました。
レイアウトを調整する
最後に愚痴る画面のレイアウトを調整するため、次のようにコードを変更します。
.sheet(isPresented: $isPresented, onDismiss: { inputText = "" }, content: { VStack { TextField("愚痴る", text: $inputText, axis: .vertical) // ここを追加↓ Spacer() } // ここを追加↓ .padding() })
変更点としては2点です。
-
VStack
にpadding
をつけたことでTextField
が端に詰まっていて見にくくなっていた問題を解消しました -
Spacer()
を使って、TextField
の配置を上詰めに変更しました
これでレイアウトが調整でき、より見やすいアプリになりました。

レイアウト要素Spacer
とは
Spacer
は、要素がないHStack
やVStack
の中で、空いているスペースを埋めるために使用するレイアウト要素です。例えば、Textの上にSpacerを置くと、このTextは下詰めになります。
VStack { Spacer() Text(“下詰め”) }
以下の例では、Textは右詰めになります。
HStack { Spacer() Text(“右詰め”) }
まとめと次回
今回はアプリを作る過程で、HStack
の使い方や余白のつけ方、Spacer
を使ったレイアウトの調整方法、テキストを入力する方法や別の画面をモーダル表示する方法などを学びました。
実は、別画面を表示した際には閉じるボタンをつけることが推奨されていますが今回は省略しています。「SwiftUI dismiss」などで検索すると、画面を閉じる方法が書かれた記事が出てくると思いますので、今回の愚痴る画面に閉じるボタンをつけるチャレンジをしても面白いかもしれません。
この連載で作ったアプリを自分なりにどんどんカスタマイズしていただき、さらにアプリ作りの楽しさにハマっていただけると嬉しいです。
次回はアプリ「カップラーメンタイマー」を作ります。お楽しみに!
