You need to enable JavaScript to run this app. 初学MVVM架构,跨两个视图控制器传递数据的方式是否正确
优惠活动
大模型
产品
解决方案
定价
更多

初学MVVM架构,跨两个视图控制器传递数据的方式是否正确

MVVM架构下跨视图控制器数据传递实现评估

问题场景

  • 学习探索MVVM架构的过程中,遇到两个视图控制器间的数据传递卡点:ViewController1绑定的viewModel1维护了一个条目数组,需要将该数组传递给viewController2,当前实现可以跑通数据传递流程,但不确定是否符合MVVM的架构规范。
  • 现有实现逻辑写在页面跳转的prepare(for:sender:)回调中:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == Constants.kShowDetailSegue {
        let destinationViewController = segue.destination as! ListViewController
        destinationViewController.products = viewModel1.getFavouriteProducts()
    }
}

备注:代码中的getFavouriteProducts方法核心职责是从CoreData层读取用户收藏的条目数据。

现有实现的不符合规范问题

  • 打破MVVM分层边界
    • 视图层职责越界:来源VC直接调用viewModel1的CoreData读取方法、直接给目标VC的内部属性赋值,把VM层的数据获取逻辑、跨页数据传递逻辑全揉进了视图层,违背了“视图只负责渲染交互,不承载业务逻辑和数据组织”的设计原则。
    • 目标VC职责混乱:目标VC直接对外暴露可被随意赋值的products数组属性,没有把数据承接的责任交给对应绑定的viewModel2,长期开发中会出现视图层直接持有业务数据、和VM层职责重叠的问题。
  • 强耦合带来维护风险
    当前实现中来源VC直接强转目标VC类型、硬编码目标VC的属性名,一旦目标页的类名调整、属性变更,会直接触发运行时崩溃,两个页面的跳转依赖没有做隔离。

规范改造方向

  • 跨页跳转逻辑做隔离,不要在来源VC的prepare回调里直接接触目标VC的内部属性。
  • 数据承接下沉到对应VM层:目标ListViewController需要绑定独立的ListViewModel,不要对外暴露可直接赋值的products数组,外部跳转时只需要传递业务参数(比如需要加载收藏列表的标识),由目标VM自己触发对应的数据读取逻辑。
  • CoreData的读取逻辑统一收口到VM层,不要在VC的跳转回调里直接触发数据获取动作。

内容的提问来源于stack exchange,提问作者iOSDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 22:06:04