如何使用包含数据和不同 view/view 模型的环境对象在 Swift 中实现 MVVM?
How is possible implementing MVVM in Swift with an environment object containing the data and differents view/view models?
我正在尝试实现我的应用程序架构,在应用程序结构中加载一个对象,该对象包含要通过环境对象在应用程序的所有视图中共享的数据:
@main
struct SMT_testingApp: App {
@StateObject private var dataManager = DataManager()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(dataManager)
}
}
}
这是发布包含数据的 var 的数据管理器 class:
class DataManager: ObservableObject {
@Published var SMTItemList: [SMTItem] = [SMTItem(id: UUID(), itemDesc: "", itemCreaDate: Date(), itemUpdDate: Date(), itemTags: [], linkedItemsUID: [])]
var urlFile: URL {
getDocumentsDirectory().appendingPathComponent("/SMT.json")
}
init() { loadData() }
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
func loadData() {
//...
在此之后包含他的视图模型实例的视图:
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
var body: some View {
List(viewModel.dataManager.SMTItemList) { item in
SMTItemView(item: item)
}
}
}
struct SMTItemView: View {
var item : SMTItem
var body: some View {
Text("Item desc: \(item.itemDesc)")
}
}
最后,包含环境对象和数据的视图模型。
extension ContentView {
class ViewModel: ObservableObject{
@EnvironmentObject var dataManager: DataManager
}
}
现在,代码构建正确,但在运行时我在内容视图中收到此错误:
我做错了什么?以这种方式实现架构是否正确(一个环境对象包含数据和许多 views/view 模型)?
谢谢
@EnvironmentObject 必须在视图范围内,而不是视图模型 class。喜欢
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
@EnvironmentObject var dataManager: DataManager // << here !!
var body: some View {
List(dataManager.SMTItemList) { item in
SMTItemView(item: item)
}
}
}
我正在尝试实现我的应用程序架构,在应用程序结构中加载一个对象,该对象包含要通过环境对象在应用程序的所有视图中共享的数据:
@main
struct SMT_testingApp: App {
@StateObject private var dataManager = DataManager()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(dataManager)
}
}
}
这是发布包含数据的 var 的数据管理器 class:
class DataManager: ObservableObject {
@Published var SMTItemList: [SMTItem] = [SMTItem(id: UUID(), itemDesc: "", itemCreaDate: Date(), itemUpdDate: Date(), itemTags: [], linkedItemsUID: [])]
var urlFile: URL {
getDocumentsDirectory().appendingPathComponent("/SMT.json")
}
init() { loadData() }
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
func loadData() {
//...
在此之后包含他的视图模型实例的视图:
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
var body: some View {
List(viewModel.dataManager.SMTItemList) { item in
SMTItemView(item: item)
}
}
}
struct SMTItemView: View {
var item : SMTItem
var body: some View {
Text("Item desc: \(item.itemDesc)")
}
}
最后,包含环境对象和数据的视图模型。
extension ContentView {
class ViewModel: ObservableObject{
@EnvironmentObject var dataManager: DataManager
}
}
现在,代码构建正确,但在运行时我在内容视图中收到此错误:
我做错了什么?以这种方式实现架构是否正确(一个环境对象包含数据和许多 views/view 模型)? 谢谢
@EnvironmentObject 必须在视图范围内,而不是视图模型 class。喜欢
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
@EnvironmentObject var dataManager: DataManager // << here !!
var body: some View {
List(dataManager.SMTItemList) { item in
SMTItemView(item: item)
}
}
}