有没有办法将视图与视图模型分离,如下所示?

Posted

技术标签:

【中文标题】有没有办法将视图与视图模型分离,如下所示?【英文标题】:Is there a way decouple views from view models like the following? 【发布时间】:2020-04-12 11:12:16 【问题描述】:

我的目标是两件事: 1.根据视图模型协议而不是具体类来制作视图。 2. 子视图从环境中获取视图模型,而不是通过视图层次结构传递它 我已经提到了我的目标,所以如果有完全不同的方式来实现它们,我愿意接受建议。 当然,这是尝试过但失败并引发奇怪错误的方法:

struct ContentView: View 
    var body: some View 
        NavigationView 
            MyView()
        
    


struct MyView: View 
    @EnvironmentObject var viewModel: some ViewModelProtocol

    var body: some View 
        HStack 
            TextField("Enter something...", text:$viewModel.text)
            Text(viewModel.greetings)
        
    


//MARK:- View Model
protocol ViewModelProtocol: ObservableObject 
    var greetings: String  get 
    var text: String  get set 


class ConcreteViewModel: ViewModelProtocol 
    var greetings: String  "Hello everyone..!" 
    @Published var text = ""


//MARK:- Usage
let parent = ContentView().environmentObject(ConcreteViewModel())

【问题讨论】:

【参考方案1】:

有,但不是很漂亮。

您遇到了问题,因为编译器无法理解它应该如何推断some protocol 应该是什么type

some 在声明你的观点时起作用的原因是它是从你提供给它的任何东西的类型中推断出来的。

如果您让视图结构采用通用视图模型类型,那么您可以启动并编译它。

struct MyView<ViewModel: ViewModelProtocol>: View 
    @EnvironmentObject var viewModel: ViewModel

    var body: some View 
        Text(viewModel.greetings)
    

这里的遗憾是,您现在必须在使用此视图时声明视图模型的 type,如下所示:

let test: MyView<ConcreteViewModel> = MyView()

【讨论】:

没错。我不希望内容视图了解有关“MyView”视图模型具体类型的任何信息。实际上我试图逃避通用解决方案,找不到解决办法。所以我决定发布一个问题?。感谢您的帮助。

以上是关于有没有办法将视图与视图模型分离,如下所示?的主要内容,如果未能解决你的问题,请参考以下文章

unity怎么打开转表工具

MVVM 架构与数据绑定库

将 JSON 响应分配给模型 SwiftUI

有没有办法在模型而不是视图中使用复数()?

Navicat for MySQL 快捷键

第55课 模型视图设计模式