MVVM模式下TableView单元格点击的数据传递问题咨询
针对TableView选中单元格MVVM实现的优化与问题排查建议
先看你当前实现的didSelectRowAt方法,这里有几个可以优化的点,同时我也会梳理MVVM模式下的最佳实践,帮你更好地排查后续问题:
现有代码的潜在问题
- 方法参数已经提供了
indexPath,但你又重新调用self.tableView.indexPathForSelectedRow!获取,这不仅冗余,而且强制解包!存在崩溃风险(比如用户快速连续点击时,选中状态可能发生变化) - 直接在ViewController中初始化详情页VC并传递ViewModel,虽然能实现功能,但可以进一步解耦,让ViewController更专注于视图层逻辑
优化后的代码示例
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ // 直接使用方法参数的indexPath,避免冗余操作与强制解包风险 let selectedOfferVM = offerViewModel.sourceAt(index: indexPath.row) let detailVC = OfferDetailViewController(nibName: "OfferDetailViewController", bundle: nil) detailVC.offerViewModel2 = selectedOfferVM // 添加上取消选中的逻辑,提升用户交互体验 tableView.deselectRow(at: indexPath, animated: true) navigationController?.pushViewController(detailVC, animated: true) }
MVVM模式下的进阶解耦思路
如果想更贴合MVVM的设计思想,可以进一步优化页面跳转逻辑:
- 给
OfferViewModel添加回调闭包,当用户选中某个条目时,由ViewModel触发回调,ViewController只负责响应回调完成页面跳转,让ViewModel专注于业务逻辑,ViewController专注于视图交互 - 也可以引入路由模式,统一管理页面跳转逻辑,让ViewController和ViewModel都不直接依赖具体的视图控制器类型,进一步降低耦合度
你提到目前有两个相关问题待解决,欢迎补充具体的问题描述(比如是数据传递异常?页面无响应跳转?还是ViewModel的状态管理问题?),我可以帮你针对性分析解决。
内容的提问来源于stack exchange,提问作者avaharper222
相关产品推荐
相关产品推荐

