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

UI コントロールを扱う





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

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




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



ステップ 3

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




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













ステップ 4

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







































ステップ 5

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




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























ステップ 6

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




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








    ProfileHost.swift


  1. import SwiftUI
  2. struct ProfileHost: View {
  3. @State private var draftProfile = Profile.default
  4. var body: some View {
  5. VStack(alignment: .leading, spacing: 20) {
  6. ProfileSummary(profile: draftProfile)
  7. }
  8. .padding()
  9. }
  10. }
  11. struct ProfileHost_Previews: PreviewProvider {
  12. static var previews: some View {
  13. ProfileHost()
  14. .environmentObject(ModelData())
  15. }
  16. }


プレビュー その 1



    ProfileHost.swift


  1. import SwiftUI
  2. struct ProfileHost: View {
  3. @Environment(\.editMode) var editMode
  4. @State private var draftProfile = Profile.default
  5. var body: some View {


    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



    ModelData.swift


  1. import Foundation
  2. import Combine
  3. final class ModelData: ObservableObject {
  4. @Published var landmarks: [Landmark] = load("landmarkData.json")
  5. var hikes: [Hike] = load("hikeData.json")
  6. @Published var profile = Profile.default
  7. var features: [Landmark] {
  8. landmarks.filter { $0.isFeatured }
  9. }
  10. var categories: [String: [Landmark]] {
  11. Dictionary(
  12. grouping: landmarks,
  13. by: { $0.category.rawValue }
  14. )
  15. }
  16. }
  17. func load<T: Decodable>(_ filename: String) -> T {
  18. let data: Data
  19. guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
  20. else {
  21. fatalError("Couldn't find \(filename) in main bundle.")
  22. }
  23. do {
  24. data = try Data(contentsOf: file)
  25. } catch {
  26. fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
  27. }
  28. do {
  29. let decoder = JSONDecoder()
  30. return try decoder.decode(T.self, from: data)
  31. } catch {
  32. fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
  33. }
  34. }


    ProfileHost.swift


  1. import SwiftUI
  2. struct ProfileHost: View {
  3. @Environment(\.editMode) var editMode
  4. @EnvironmentObject var modelData: ModelData
  5. @State private var draftProfile = Profile.default
  6. var body: some View {
  7. VStack(alignment: .leading, spacing: 20) {
  8. HStack {
  9. Spacer()
  10. EditButton()
  11. }
  12. ProfileSummary(profile: modelData.profile)
  13. }
  14. .padding()
  15. }
  16. }
  17. struct ProfileHost_Previews: PreviewProvider {
  18. static var previews: some View {
  19. ProfileHost()
  20. .environmentObject(ModelData())
  21. }
  22. }


プレビュー その 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. }






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






目次
Xcode の新機能

フレームワーク

  • SwiftUI

  • ビューの作成と結合

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    ビルドリストとナビゲーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7

    セクション 8


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107

    セクション 108

    ユーザー入力の処理

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    パスとシェイプの描画

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    ビューと移行のアニメーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    複雑なインターフェースの構成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    UI コントロールを扱う

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    UIKit とのインターフェース

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    watchOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    macOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107