100 Days of SwiftUI(DAY 79(Project16 part 1))

@EnvironmentObjectを使用して環境からカスタム値を読み取る
Reading custom values from the environment with @EnvironmentObject

@ObservedObjectている場合は、各ビューから次のビューにオブジェクトを渡す必要があります。
@EnvironmentObject、ビューAは、環境にオブジェクトを置くことができ、ビューEは、環境からオブジェクトを読み出すことができる、とビューのB、C、およびDは、何が起こったのを知っている必要はありません-それは非常に良くあります。

@EnvironmentObjectプロパティラッパーを使用して、このデータの値がローカルで作成されるのではなく、環境から取得されることを示します。
@EnvironmentObjectプロパティラッパーはUser、環境内のインスタンスを自動的に検索し、見つかったものをuserプロパティに配置します
EditViewととDisplayView両方ContentViewの子であるため、ContentViewそれらの環境は自動的に継承されます。

//
//  ContentView.swift
//  HotProspects

import SwiftUI

//---------------------------
class User: ObservableObject {
    @Published var name = "Taylor Swift2"
}
//---------------------------
struct EditView: View {
    @EnvironmentObject var user: User

    var body: some View {
        TextField("Name", text: $user.name)
    }
}
//---------------------------
struct DisplayView: View {
    @EnvironmentObject var user: User

    var body: some View {
        Text(user.name)
    }
}
//---------------------------
//struct ContentView: View {
//    let user = User()
//
//    var body: some View {
//        VStack {
//            EditView().environmentObject(user)
//            DisplayView().environmentObject(user)
//        }
//    }
//}
//---------------------------
//---------------------------
struct ContentView: View {
    let user = User()

    var body: some View {
        VStack {
            EditView()
            DisplayView()
        }
        .environmentObject(user)
    }
}
//---------------------------
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

TabViewとtabItem()でタブを作成する
Creating tabs with TabView and tabItem()

TabView
ナビゲーションビューは、ユーザーがデータにドリルダウンできるビューの階層スタックを作成するのに最適ですが、関連のないデータを表示するにはあまり機能しません。そのためにはTabView、SwiftUIを使用する必要があります。これにより、画面下部にボタンストリップが作成されます。各ボタンをタップすると、異なるビューが表示されます。

@State現在表示されているタブを追跡するプロパティを作成します。
別のタブにジャンプしたいときはいつでも、そのプロパティを新しい値に変更します。
それをバインディングとしてに渡すと、TabView自動的に追跡されます。
そのプロパティの値ごとにどのタブを表示するかをSwiftUIに指示します。


import SwiftUI

//---------------------------
struct ContentView: View {
    @State private var selectedTab = 0

    var body: some View {
        TabView(selection: $selectedTab) {
            Text("Tab 1")
                .onTapGesture {
                    self.selectedTab = 1
                }
                .tabItem {
                    Image(systemName: "star")
                    Text("One")
                }
                .tag(0)

            Text("Tab 2")
                .tabItem {
                    Image(systemName: "star.fill")
                    Text("Two")
                }
                .tag(1)
        }
    }
}
//---------------------------