简体   繁体   English

如何参考 SwiftUI EnvironmentObject

[英]How to reference with SwiftUI EnvironmentObject

According to the Apple Official guide I'm guessing if each view just has one environmentObject then doing that would be fine.根据 Apple 官方指南,我猜如果每个视图只有一个 environmentObject,那么这样做就可以了。 When there happened to be more than one, I'm not sure how the object are referenced.当碰巧不止一个时,我不确定如何引用 object。

struct LandmarkList: View {
    @EnvironmentObject private var userData: UserData
...
 ForEach(userData.landmarks) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(
                            destination: LandmarkDetail(landmark: landmark)
                                .environmentObject(self.userData)

                        ) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }

Above is the code in apple's official guide where in LandMarkDetail file以上是苹果官方指南中的代码,位于 LandMarkDetail 文件中

struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData

I am wondering how is the environmentObject in LandMarkList referenced to the environment object in LandmarkDetail.我想知道 LandMarkList 中的 environmentObject 是如何引用 LandmarkDetail 中的环境 object 的。 Are they binded?他们有约束力吗? I added a second EnvironmentObject in the file but nothing happened我在文件中添加了第二个 EnvironmentObject 但什么也没发生

struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData
    @EnvironmentObject var testData: UserData

So how to reference to each of the userData and testData那么如何引用userData和testData中的每一个

Edit: I tried to add environment object in following file:编辑:我尝试在以下文件中添加环境 object:

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject private var userData: UserData
    @EnvironmentObject private var testData: TestData
    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Show Favorites Only")
                }
                Toggle(isOn: $testData.testbool) {
                                   Text("Test")
                }
...
struct LandmarksList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }
        .environmentObject(UserData())
        .environmentObject(TestData())
    }
}
final class TestData: ObservableObject {
    @Published var testbool = false
}

The preview crashed.预览崩溃了。 Xcode could compile but immediately gives following error Xcode 可以编译但立即给出以下错误

Fatal error: No ObservableObject of type TestData found.
A View.environmentObject(_:) for TestData may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-30.4/Core/EnvironmentObject.swift, line 55
2019-10-12 19:07:46.565707+0800 Landmarks[13034:643289] Fatal error: No ObservableObject of type TestData found.
A View.environmentObject(_:) for TestData may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-30.4/Core/EnvironmentObject.swift, line 55

don't forget to do this in Scenedelegate to bind your object:不要忘记在 Scenedelegate 中执行此操作以绑定您的 object:

window.rootViewController = UIHostingController(rootView: contentView.environmentObject(TestData()).environmentObject(UserData()))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM