如何解决SwiftUI:无法创建其他每个视图都可以看到的简单布尔值
我正在从内容管理系统的API加载整个应用程序中显示的数据。数据加载完成后,我希望能够将布尔值从false
更改为true
,然后使该布尔值可被应用程序中的所有其他视图读取,这样我就可以创建条件/ else语句,取决于数据是否已加载。
我尝试通过在根级别创建一个Observable Object来存储布尔值,并默认将其设置为false来实现此目的:
@main
struct MyApp: App {
@StateObject var dataLoadingObject = DataHasLoaded()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(dataLoadingObject)
}
}
}
class DataHasLoaded: ObservableObject {
@Published var status: Bool = false
}
然后,在我的数据模型文件中,我尝试使用@EnvironmentObject
引用该Observable Object,然后在数据加载后将布尔值切换为true
:
class DataStore: ObservableObject {
@Published var stories: [Story] = storyData
@EnvironmentObject var dataLoadingObject: DataHasLoaded
init() {
// Fetching and appending
// the data here
self.dataLoadingObject.status = true
}
}
该应用程序构建成功,但是在加载数据时崩溃,我收到以下错误消息:Thread 1: Fatal error: No ObservableObject of type DataHasLoaded found. A View.environmentObject(_:) for DataHasLoaded may be missing as an ancestor of this view.
似乎问题在于我的数据模型视图不是ContentView()
的子级,因此它不知道环境对象。那就是我被困住的地方。我可以吗?
a)尝试让我的数据模型成为ContentView()的子代吗?
b)使用不需要父母/孩子关系的东西?
c)解决这种完全不同的方式吗?
d)继续用我的头撞在桌子上吗?
感谢您的帮助!
解决方法
@EnvironmentObject
仅可在View
中使用。不能在ObservableObject
中使用。
您可以改为在DataHasLoaded
中传递init
:
class DataStore: ObservableObject {
@Published var stories: [Story] = storyData
var dataLoadingObject: DataHasLoaded
init(dataLoadingObject: DataHasLoaded) {
self.dataLoadingObject = dataLoadingObject
...
}
}
只需确保始终传递相同的实例即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。