SwiftUIの不具合を調べるときは、まず「どの操作で、何が期待と違うか」を固定すると、確認すべき範囲を絞れます。この記事では、入力値が親画面に反映されないケースを例に、状態の持ち方と再現手順の整理方法を紹介します。
以下は説明用の最小サンプルです。特定の公開アプリで発生した障害の報告ではありません。
1. 期待する動作を一文にする
「編集画面で名前を変更したら、親画面の表示も変わる」を期待する動作とします。
- 画面を開く。初期値が「サンプル」であることを確認する。
- TextFieldを「変更後」に書き換える。
- 親画面の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アプリの軽微な修正・機能追加の相談窓口をココナラに用意しています。対応可否、作業範囲、料金、納期を購入前に確認します。
まずは上のテンプレートで症状を整理していただくと、相談内容を共有しやすくなります。