swift - 如何使用 SwiftUI EnvironmentObject 进行引用

标签 swift swiftui

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

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文件中

struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData

我想知道LandMarkList中的environmentObject如何引用LandmarkDetail中的环境对象。他们有约束力吗? 我在文件中添加了第二个环境对象,但什么也没发生

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

那么如何引用每个userData和testData

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

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
}

预览崩溃了。 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

最佳答案

不要忘记在 Scenedelegate 中执行此操作来绑定(bind)您的对象:

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

关于swift - 如何使用 SwiftUI EnvironmentObject 进行引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58353396/

相关文章:

ios - 如何显示 AirPlay 菜单 SwiftUI

在 OS X Swift 应用程序中单击按钮时 Xcode 打印 "Hello World"的方法?

ios - cocoapds ld : framework not found Pods_Target

swift - 如何 swift 开始和结束一周?

ios - 如何使用 SwiftUI 在导航栏上添加按钮

SwiftUI 捕获从基于 Web 的登录表单发回的 RedirectUri

Swift - 设置 APNSToken Firebase Messaging 的正确方法

json - 使用较旧的 swift 方法“JSONObjectWithData”将数据序列化为 JSON?

ios - SwiftUI:使用@Binding 关闭模态视图不起作用

swift - 这个 SwiftUI 动画应该只会淡出。为什么会向右移动?