ios 为什么我不能遵守带有@EnvironmentObject变量的协议?

efzxgjgh  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(93)

因此,我试图使用@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("")
    }
}
2uluyalo

2uluyalo1#

你不应该在SwiftUI中有一个类ViewModel,因为View结构已经是一个视图模型,所以你会试图复制SwiftUI已经做的事情。
您可能需要的是一个存储对象,用于加载/保存模型结构。通常,该对象有一个用于应用程序的单例,另一个用于加载示例数据的预览。它通常在App结构和Preview中使用.environmentObject修饰符传递到View层次结构中。

相关问题