SwiftUI - 如何在@ObservableObject 中获取@EnvironmentObject 数据

Posted

技术标签:

【中文标题】SwiftUI - 如何在@ObservableObject 中获取@EnvironmentObject 数据【英文标题】:SwiftUI - how to get @EnvironmentObject data inside @ObservableObject 【发布时间】:2020-08-27 23:08:45 【问题描述】:

是否可以在 ObservableObject 中使用@EnvironmentObject?

它给了我一个错误:

Fatal error: No ObservableObject of type EntryViewModel found. A View.environmentObject(_:) for EntryViewModel may be missing as an ancestor of this view.: file SwiftUI, line 0

我知道@EnvironmentObject 很好,因为我在其他地方使用它。

如果没有,我该如何获取信息?

class ResultsViewModel: ObservableObject 
    @EnvironmentObject var entry: EntryViewModel
    ...

谢谢。

【问题讨论】:

【参考方案1】:

是否可以在 ObservableObject 中使用 @EnvironmentObject?

不,不是。 @EnvironmentObject 只能在 View 中使用。

如果没有,我该如何获取信息?

一个可能的解决方案是在init 中传递它:

class ResultsViewModel: ObservableObject 
    var entry: EntryViewModel

    init(entry: EntryViewModel) 
        self.entry = entry
    

另一种解决方案可能是使用singleton 或(也许是最好的)dependency injection。

【讨论】:

我尝试了 init() 并没有成功。导致其他问题。谢谢。 @diogenes EnvironmentObject 是视图的一种单例。如果您想让它始终可用,您可能需要使用单例或dependency injection 这有点超过我的工资等级。现在正在研究...谢谢。 有趣的是,您可以在 ObservableObject 中使用 Environment。尽管文档将 Environment 描述为“从视图环境中读取值的属性包装器”。 @SerhiiK 是这样吗?请确认 :) 我正在跑去测试。

以上是关于SwiftUI - 如何在@ObservableObject 中获取@EnvironmentObject 数据的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何在 SwiftUI 中弹出到特定视图?

如何在 SwiftUI 中使用 Realm

如何在 UIkit 中添加 SwiftUI 对象

如何使用 SwiftUI 在 UICollectionViewCell 中填充内容

如何在 SwiftUI 中创建指数

如何在 SwiftUI 的 ScrollView 中制作动画? SwiftUI 中的手风琴风格动画