SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ミニアプリを作って楽しく学ぶSwift

【ミニアプリを作って楽しく学ぶSwift】 愚痴を思う存分に吐き出すためのアプリを作ろう

ミニアプリを作って楽しく学ぶSwift入門 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

テキストを入力できるようにする

 ユーザーがテキストを入力できるようにするには、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シミュレーターでの動作確認は、MyAppCollectionAppViewを書き換えてビルドを実行してみて下さい。

@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点です。

  • VStackpaddingをつけたことでTextFieldが端に詰まっていて見にくくなっていた問題を解消しました
  • Spacer()を使って、TextFieldの配置を上詰めに変更しました

 これでレイアウトが調整でき、より見やすいアプリになりました。

レイアウト要素Spacerとは

 Spacerは、要素がないHStackVStackの中で、空いているスペースを埋めるために使用するレイアウト要素です。例えば、Textの上にSpacerを置くと、このTextは下詰めになります。

Textが下詰めとなる例
VStack {
        Spacer()
        Text(“下詰め”)
}

 以下の例では、Textは右詰めになります。

Textが右詰めとなる例
HStack {
        Spacer()
        Text(“右詰め”)
}

まとめと次回

 今回はアプリを作る過程で、HStackの使い方や余白のつけ方、Spacerを使ったレイアウトの調整方法、テキストを入力する方法や別の画面をモーダル表示する方法などを学びました。

 実は、別画面を表示した際には閉じるボタンをつけることが推奨されていますが今回は省略しています。「SwiftUI dismiss」などで検索すると、画面を閉じる方法が書かれた記事が出てくると思いますので、今回の愚痴る画面に閉じるボタンをつけるチャレンジをしても面白いかもしれません。

 この連載で作ったアプリを自分なりにどんどんカスタマイズしていただき、さらにアプリ作りの楽しさにハマっていただけると嬉しいです。

 次回はアプリ「カップラーメンタイマー」を作ります。お楽しみに!

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ミニアプリを作って楽しく学ぶSwift連載記事一覧

もっと読む

この記事の著者

リルオッサ(リルオッサ)

 ブレイクダンサー、時々iOSエンジニア。元ブレイクダンス世界2位。 現在は、楽しいことを追い求め、iOSアプリを作ったり、ビールを飲んだり、絵を書いたり、技術記事を書いたり、海外登壇チャレンジしたり、ブレイクダンスの大会を企画したりしています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20802 2025/03/14 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング