swiftUI中可以在整个应用中使用的保存数组



我将一些数据保存在一个数组中,该数组应该在整个应用程序中全局使用。该数组可以编辑或删除。我发现我们可以使用@EnvironmentObject,并尝试了以下

@main

struct DineApp: App {
var body: some Scene {
WindowGroup {
View1().environmentObject(BookViewModel())
}
}

BookViewModel :
class BookViewModel : ObservableObject{
@Published  var bookarray = [Book]()
func saveBook (Id: Int, Name: String){
bookarray.append(Book(Id: id, Name: name ). // How to use this bookarray through out the app
}
}
View1: 
struct View1: View {
@EnvironmentObject var bookviewModel : BookViewModel
var body: some View {
//Code to save book on a button click
saveBook(Id: selectedId, Name: selectedName) //Selected books will be saved.  
}
} 
struct View1_Previews: PreviewProvider {
static let bookViewModel = BookViewModel()
static var previews: some View {
View1().environmentObject(bookViewModel)
}
}

View4: 
struct View4: View {
@EnvironmentObject var bookviewModel : BookViewModel
var body: some View {
// Display saved books in a list. But it shows empty List
List(bookviewModel.bookarray) id:name){row in
Text(row.name)
}
}
}
struct View4_Previews: PreviewProvider {
static let bookViewModel = BookViewModel()
static var previews: some View {
View4().environmentObject(bookViewModel)
}
}

这给了我一个错误,EnvironmentObject should be passed from ancestor view。我不明白,该在哪里传球,怎么传球。关键是我需要访问bookarray在多个视图,所以我无法理解什么从一个视图传递到另一个。

obj-C中,我们有appdelegate,如果我们想在整个应用程序中全局使用数据,我们可以在其中存储任何数据。在swiftUI中有什么相似之处?

EnvironmentObject应该从祖先视图传递

意味着您必须将对象注入视图层次结构更高层次的环境中。并且想要访问该对象的视图必须是该视图的后代。

顶层是@main结构体,添加到这里,例如

@main
struct SwiftUIApp: App {

var body: some Scene {
WindowGroup {
ContentView()
}
.environmentObject(BookViewModel())
}
}

View4必须是SwiftUIAppContentView的后代