Swiftui 如何设置 EnvironmentObject 表单 NavigationLink

Switfui How set EnviromentObject from NavigationLink

我想在 View 2 中显示我在 View 1 中选择的元素。我写了这个简单的代码,但它不起作用,因为我无法理解如何在 NavigationLink 中设置 dataStore。任何人都可以更正代码以使其工作吗?

import SwiftUI

class DataStore: ObservableObject {
    @Published var itemNumber = 0
}

struct ContentView: View {

    @EnvironmentObject var dataStore:DataStore

    var body: some View {
        TabView {
            // First View Tab
            NavigationView {
                List(0..<5) { item in
                    NavigationLink(destination: DetailView().environmentObject(self.dataStore)) {
                        Text("Item: \(item)")
                    }
                }
            }
            .tabItem {
                Text("View 1")
            }            
            // Second View Tab
            Text("This is the item selected in View Tab 1: \(dataStore.itemNumber)")
                .tabItem {
                    Text("View 2")
            }
        }
    }
}

struct DetailView:View {
    @EnvironmentObject var dataStore:DataStore
    var body: some View {
        Text("Item: \(dataStore.itemNumber)")
    }
}

SceneDelegate 中我将 dataStore 设置为 environmentObject:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    var dataStore = DataStore()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView()

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView.environmentObject(dataStore))
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}

如果您需要依赖项,请找到进行依赖项注入的位置。

这是可能的方法。使用 Xcode 11.4 / iOS 13.4

测试
struct ContentView: View {

    @EnvironmentObject var dataStore:DataStore

    var body: some View {
        TabView {
            // First View Tab
            NavigationView {
                List(0..<5) { item in
                    NavigationLink(destination: DetailView(item: item)) {
                        Text("Item: \(item)")
                    }
                }
            }
            .tabItem {
                Text("View 1")
            }
            // Second View Tab
            Text("This is the item selected in View Tab 1: \(dataStore.itemNumber)")
                .tabItem {
                    Text("View 2")
            }
        }
    }
}

struct DetailView:View {
    let item: Int
    @EnvironmentObject var dataStore:DataStore
    var body: some View {
        Text("Item: \(dataStore.itemNumber)")
        .onAppear {
            self.dataStore.itemNumber = self.item
        }
    }
}