@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)
}
}
}
//---------------------------