0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftUIの「入力しても反映されない」を切り分ける:State・Bindingと再現手順

0
Posted at

SwiftUIの不具合を調べるときは、まず「どの操作で、何が期待と違うか」を固定すると、確認すべき範囲を絞れます。この記事では、入力値が親画面に反映されないケースを例に、状態の持ち方と再現手順の整理方法を紹介します。

以下は説明用の最小サンプルです。特定の公開アプリで発生した障害の報告ではありません。

1. 期待する動作を一文にする

「編集画面で名前を変更したら、親画面の表示も変わる」を期待する動作とします。

  1. 画面を開く。初期値が「サンプル」であることを確認する。
  2. TextFieldを「変更後」に書き換える。
  3. 親画面のTextが「変更後」になったかを確認する。

「入力できない」「入力できるが表示が変わらない」「再起動すると戻る」は別の症状です。再起動後も残したい場合は、状態共有とは別に永続化の設計が必要です。

2. 子画面に独立したStateを作っていないか確認する

次のように子画面が別の状態を持つと、子の入力は親の状態を書き換えません。

struct IndependentEditor: View {
    @State private var name = "サンプル"

    var body: some View {
        TextField("名前", text: $name)
    }
}

この実装が常に間違いというわけではありません。「保存ボタンを押すまで親に反映しない」編集用の下書きなら、独立した状態を持つ設計も考えられます。今回は即時反映したいため、親の状態へのBindingを渡します。

3. 親のStateを子のBindingにつなぐ

import SwiftUI

struct ContentView: View {
    @State private var name = "サンプル"

    var body: some View {
        VStack(alignment: .leading, spacing: 16) {
            Text("現在の名前:\(name)")
            NameEditor(name: $name)
        }
        .padding()
    }
}

struct NameEditor: View {
    @Binding var name: String

    var body: some View {
        TextField("名前", text: $name)
            .textFieldStyle(.roundedBorder)
    }
}

親がStateを持ち、子はBindingを通して同じ値を読み書きします。$nameは、ここではBindingを渡すために使っています。

新規SwiftUIプロジェクトのContentViewを置き換えると試せます。既存のアプリには、同名の型を重複して追加せず、必要な部分を組み込んでください。

この例は文字列の編集だけを扱います。複数画面で共有する参照型モデル、通信、保存処理がある場合は、そのデータの所有者と更新経路も確認します。この記事のコードを当てはめるだけで、あらゆる表示不具合が解決するわけではありません。

掲載コードは手元のmacOS向けSwiftコンパイラで型チェックしました。iOS実機での動作確認は行っていません。ご自身の対象OS・開発環境でも確認してください。

4. 修正後は「同じ手順」と「周辺の動作」を確認する

まず最初の3手順をもう一度実行します。そのうえで、空文字、長い文字列、日本語入力、画面を閉じて開き直す操作も確認します。

再起動後に初期値へ戻ることは、このサンプルでは想定どおりです。Stateによる画面内の状態管理と、ファイルやデータベースへの保存は分けて確認しましょう。

5. 切り分けを相談するときのテンプレート

期待する動作:
実際の動作:
再現手順:1. / 2. / 3.
発生頻度:毎回 / 時々 / 特定条件のみ
環境:Xcode、対象OS、端末またはSimulator
直前の変更:
確認済みのこと:
関連する最小コード:

環境は「最新版」ではなく具体的なバージョンを書くと比較できます。ソースを共有する前にバックアップを取り、APIキー、秘密鍵、パスワード、顧客データを除いてください。

参考資料

開発・修正の相談について

Swift/SwiftUIアプリの軽微な修正・機能追加の相談窓口をココナラに用意しています。対応可否、作業範囲、料金、納期を購入前に確認します。

既存Swiftアプリの不具合修正・機能追加

まずは上のテンプレートで症状を整理していただくと、相談内容を共有しやすくなります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?