首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何引用SwiftUI EnvironmentObject

如何引用SwiftUI EnvironmentObject
EN

Stack Overflow用户
提问于 2019-10-12 18:55:34
回答 1查看 2.5K关注 0票数 2

根据苹果官方指南,我猜如果每个视图只有一个environmentObject,那么这样做就可以了。当碰巧有多个对象时,我不确定对象是如何引用的。

代码语言:javascript
复制
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)
                        }
                    }
                }

上面是苹果官方指南中的代码,位于LandMarkDetail文件中

代码语言:javascript
复制
struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData

我想知道LandMarkList中的environmentObject是如何引用LandmarkDetail中的环境对象的。它们被捆绑了吗?我在文件中添加了第二个EnvironmentObject,但什么也没有发生

代码语言:javascript
复制
struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData
    @EnvironmentObject var testData: UserData

那么如何分别引用userData和testData呢?

编辑:我尝试在以下文件中添加环境对象:

代码语言:javascript
复制
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")
                }
...
代码语言:javascript
复制
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())
    }
}
代码语言:javascript
复制
final class TestData: ObservableObject {
    @Published var testbool = false
}

预览崩溃了。Xcode可以编译,但立即显示以下错误

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-10-22 15:58:23

别忘了在Scenedelegate中执行此操作以绑定您的对象:

代码语言:javascript
复制
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(TestData()).environmentObject(UserData()))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58353396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档