我将一些数据保存在一个数组中,该数组应该在整个应用程序中全局使用。该数组可以编辑或删除。我发现我们可以使用@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
必须是SwiftUIApp
或ContentView
的后代