アプリのデザインとレイアウト

UI コントロールを扱う





訳注:以下、必要な場所においては Mac と iPhone 両方のセクションを提供しています。
Mac → セクション 2、iPhone → セクション 102 とします。

環境の \.editMode をキーオフする Environment ビュープロパティを追加します。




SwiftUI は、@Environment プロパティラッパーを使用してアクセスできる環境の値の保管場所を提供します。editMode 値にアクセスして、編集のスコープの読み取りまたは書き込みを行います。



    ProfileHost.swift


  1. struct ProfileHost: View {
  2. @Environment(\.editMode) var editMode
  3. @State private var draftProfile = Profile.default


プレビュー その 1



ステップ 3

環境の editMode 値のオンとオフを切り替える [Edit(編集)] ボタンを作成します。




EditButton は、以前の手順でアクセスしたものと同じ editMode 環境値を制御します。



    ProfileHost.swift


  1. var body: some View {
  2. VStack(alignment: .leading, spacing: 20) {
  3. HStack {
  4. Spacer()
  5. EditButton()
  6. }
  7. ProfileSummary(profile: draftProfile)
  8. }


プレビュー その 2



ステップ 4

ModelData クラスを更新して、ユーザがプロファイルビューを閉じた後も存続するユーザプロファイルのインスタンスを含めます。



    ModelData.swift


        ModelData.swift


  1. @Published var landmarks: [Landmark] = load("landmarkData.json")
  2. var hikes: [Hike] = load("hikeData.json")
  3. @Published var profile = Profile.default
  4. var features: [Landmark] {


プログラム全体 その 2


ステップ 5

環境からユーザプロファイルデータを読み取り、データの制御をプロファイルホストに渡します。




ユーザが名前を入力しているときなど、編集を確認する前にグローバルアプリの状態が更新されないようにするために、編集ビューはそれ自体のコピーを操作します。



    ProfileHost.swift


  1. struct ProfileHost: View {
  2. @Environment(\.editMode) var editMode
  3. @EnvironmentObject var modelData: ModelData
  4. @State private var draftProfile = Profile.default


プログラム全体 その 3


プレビュー その 3



ステップ 6

静的プロファイルまたは編集モードのビューのいずれかを表示する条件付きビューを追加します。




ライブプレビューを実行して編集ボタンをタップすると、[Edit(編集)] モードに入ったときの効果を確認できます。今のところ、Edit モードビューは単なる静的テキストフィールドです。



プレビュー その 3



    ProfileHost.swift


  1. EditButton()
  2. }
  3. if editMode?.wrappedValue == .inactive {
  4. ProfileSummary(profile: modelData.profile)
  5. } else {
  6. Text("Profile Editor")
  7. }
  8. }
  9. .padding()
  10. }


プログラム全体 その 4





セクション 1セクション 2
セクション 3セクション 4
セクション 101セクション 102
セクション 103セクション 104