在 MVVM + Coordinator 中,如何处理子视图?

Posted

技术标签:

【中文标题】在 MVVM + Coordinator 中,如何处理子视图?【英文标题】:In MVVM + Coordinator, how to deal with sub view? 【发布时间】:2020-12-12 10:53:57 【问题描述】:

我正在开发一个 ios MVVM + Coordinator/RxSwift 项目(非 swiftUI)。

在groundViewController中,屏幕上有多个项目,用户可以点击任何项目来调用该项目的详细视图。点击一个项目后,详细视图将滑入,当用户点击另一个项目时,详细视图将滑出,然后再次滑入更新信息。 detailView 是半屏大小,用户也可以点击 groundViewController 上的空白区域来关闭详细视图(滑出动画)。(所以只有一个 detailView)

我决定将详细视图制作为 UIView,它将拥有自己的协调器和 ViewModel,并添加到 groundViewControll.view。但是我现在对如何在它们之间或事件流之间进行通信感到困惑。

问题:在 MVVM/Coordinator 模式中,将此流程设置为是否正确:

groundViewController (receive a tap on the object) - > 
groundViewModel - >
groundCoordinator (creat and pass itemID ) - > 
detailedViewCoordinator (creat) - > 
detailedViewModel and detialedView

detialedView 的滑入/滑出动画应该由谁负责?

【问题讨论】:

GroundCoordinator 应该负责显示细节并将其关闭。你应该将协调器的路由传递给detailView,它会触发另一个detail,但会先关闭当前detail。 那么当详细视图可见时,您仍然可以看到地面视图上的项目并与之交互? @DanielT。你是对的。这也是我选择 UIView 而不是 UIViewController 的原因之一。我刚刚更新了问题以使其更清楚。 【参考方案1】:

当地面视图收到点击时,它会告诉地面视图模型。

    地面视图模型告诉地面协调员。 地面协调员通知当前细节协调员(如果有的话)解雇。 当前详细信息协调员取消了其视图。 地面协调员创建一个新的细节协调员。 地面协调员告诉新的细节协调员进行演示。 新的细节协调器创建细节视图模型和细节 看法。它将详细视图模型传递给详细视图。 细节协调员显示细节视图。

在创建和销毁项目的确切时间方面存在一些差异,但以上是大体思路。

【讨论】:

谁应该负责 /trigger detialedView 的滑入/滑出动画? 细节协调器触发它,视图控制器执行它。

以上是关于在 MVVM + Coordinator 中,如何处理子视图?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MVVM+Coordinators 模式的 UIViewController 转换

iOS:MVVM-C ViewController 超类

AppArchitecture-8种

是否可以在 UIViewRepresentable 中使用 Coordinator 检测 PDFView 通知?

storm trident 如何标记一个batch被处理——coordinator spout

在 NSViewControllerRepresentable 中使用 SwiftUI Coordinator 和 NSTableView?