【问题标题】:Switfui How set EnviromentObject from NavigationLinkSwiftui 如何从 NavigationLink 设置环境对象
【发布时间】:2020-05-17 19:18:40
【问题描述】:

我想在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()
        }
    }
}

【问题讨论】:

    标签: swiftui swiftui-navigationlink


    【解决方案1】:

    如果你需要依赖然后找到在哪里进行依赖注入。

    这是可能的方法。使用 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
            }
        }
    }
    

    【讨论】:

    • 我也使用过您的相同方法,但我想了解是否还有另一种方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多