因此,我试图使用@EnvironmentObject变量来遵循协议,但编译器会抱怨,而如果使用@ObservedObject,它就可以工作。
使用@EnvironmentObject:
final class ViewModel: ObservableObject {
@Published var someOutput: String
init(someOutput: String) {
self.someOutput = someOutput
}
}
protocol SomeChildView: View {
var viewModel: ViewModel { get set }
}
struct FirstChildView: SomeChildView {
@EnvironmentObject var viewModel: ViewModel // <-- This does not work.
var body: some View {
Text("")
}
}
使用@ObservedObject:
struct FirstChildView: SomeChildView {
@ObservedObject var viewModel: ViewModel // <-- Works
var body: some View {
Text("")
}
}
1条答案
按热度按时间2uluyalo1#
你不应该在SwiftUI中有一个类
ViewModel
,因为View
结构已经是一个视图模型,所以你会试图复制SwiftUI已经做的事情。您可能需要的是一个存储对象,用于加载/保存模型结构。通常,该对象有一个用于应用程序的单例,另一个用于加载示例数据的预览。它通常在App结构和Preview中使用
.environmentObject
修饰符传递到View
层次结构中。