swift - 如何在兄弟视图之间传递环境对象?
问题描述
我正在尝试在兄弟视图之间传递一些数据。
我有VerseDetailView
一个按钮:
@StateObject var favoritesViewModel = FavoritesViewModel()
...
Button("Add to favorite") {
favoritesViewModel.add(verse: verse)
}
我的FavoritesViewModel
样子是这样的:
class FavoritesViewModel: ObservableObject {
@Published var favoriteVerses: [Verse] = []
func add(verse: Verse) {
favoriteVerses.append(verse)
}
}
我将如何传递favoriteVerses
以显示在完全不同的子视图中?
我的主应用程序文件如下所示:
var body: some Scene {
WindowGroup {
TabView {
NavigationView {
BookView() // VerseDetailView is a child of this view
}
.tabItem {
Image(systemName: "book")
Text("Books")
}
NavigationView {
FavoritesView() // I want to get the array of favoriteVerses here
}
.tabItem {
Image(systemName: "bookmark")
Text("Favorites")
}
}
}
}
我的FavoritesView
样子是这样的:
struct FavoritesView: View {
@EnvironmentObject var favoritesViewModel: FavoritesViewModel
// is this correct?
// I get a hread 1: "Fatal error: No ObservableObject of type FavoritesViewModel found" error
var body: some View {
List {
Section(header: Text("Favorite verses")) {
ForEach(favoritesViewModel.favoriteVerses) { verse in
Text(verse.verse)
}
}
}
}
}
我尝试在主应用程序文件的顶部添加它:
var favoritesViewModel = FavoritesViewModel()
...
NavigationView {
FavoritesView().environmentObject(favoritesViewModel)
}
但这也不起作用
解决方案
将其添加为常见的顶视图(在您的情况下是TabView
),例如
TabView {
NavigationView {
BookView() // VerseDetailView is a child of this view
}
.tabItem {
Image(systemName: "book")
Text("Books")
}
NavigationView {
FavoritesView() // I want to get the array of favoriteVerses here
}
.tabItem {
Image(systemName: "bookmark")
Text("Favorites")
}
}
.environmentObject(favoritesViewModel) // << here !!
推荐阅读
- javascript - 如何在 laravel 的多个选项卡中导出数据表?
- angular - 使用 api 在事件数组中添加新事件后,更新的完整日历事件未呈现
- delphi - Delphi - 如何将多个 JPG 图像添加到 TCanvas 并打印它们
- xpath - 如何使用 xpath 从类中获取文本
- javascript - 动态添加列
- reactjs - 使用每个问题的答案为每个问题创建一个反应选择
- django - 使用 nginx 作为代理服务器在同一个 ubuntu 实例上运行多个 django 项目,nginx 将一些请求从一个域转发到错误的端口
- python - 如何擦除/删除 QGraphicPathItem 的特定部分?
- excel - Excel VBA - 单击排序按钮或从 IE 的下拉列表中选择
- javascript - array.foreach 不起作用。当然我错过了一些小东西