繁体   English   中英

iOS - MVP 设计中的 UITableView 委托和数据源

[英]iOS - UITableView delegate & datasource in MVP design

我正在尝试使用 Model-View-Presenter 实现UITableViewController 由于我是这个概念的新手,我对如何将UITableView's数据源协议与UIViewController分开感到非常困惑。

许多文章都同意 View+Viewcontroller 需要愚蠢并且只考虑 UI 及其布局的想法。 另一方面,Presenter 需要成为视图和模型之间的促进者并实现逻辑,但他们表示不包含 UIKit,因为它不直接操作 UI。 这就是我的困惑开始的地方。

我们在实现 UITableView 的时候,要实现两个协议: UITableViewDelegateUITableViewDataSource ,尤其是数据源。

我假设委托属于 View 部分,并在接收到用户操作时将事件传递给 Presenter。

然而,要实现UITableViewDataSource ,我们必须有一些表格视图使用的模型。 话虽如此,我只能想到两种方式以某种方式适应 MVP。

  1. 将Model值从Presenter传递给UITableView ,为了数据源(比如为特定的索引创建一行),让它在视图中是只读的。 但后来我认为它违反了 MVP 概念,因为 Model 值是由 View 直接访问的。

  2. 让 Presenter 成为数据源。 但是由于Presenter不应该导入UIKit,我认为导入UIKit并实现UITableViewDatasource也违反了MVP的概念。

长话短说,我很困惑在哪里以及如何适当地实现 UITableDatasource ......如果有人很了解这个概念,请分享你的知识。 先感谢您!

第一个选项是在 MVP 中使用适配器模式 您可以在适配器类中符合UITableViewDelegateUITableViewDataSource 通过这种方式,您可以将 tableView 逻辑与 ViewController 分开,Presenter 仍然不会包含 UIKit。

在 UIViewController 中创建一个单元格项:

私有 var cellItems: [CarCellItem]

此单元格项数组将在 Presenter 中创建(通过从服务器或本地数据库获取数据)。

在这里,我们没有使用从服务器或本地数据库接收的模型; 相反,我们正在从模型创建 cellItem 数组并将此单元格项数组发送回视图控制器

仅在 UIViewController 中实现数据源和委托:

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return cellItems.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: Constant.cellIdentifier, for: indexPath) as! CarListCell cell.configure(cellItem: cellItems[indexPath.row]) return cell }

像这样创建单元格:

class CarListCell: UITableViewCell  {
 @IBOutlet weak var name: UILabel!
  func configure(cellItem: CarCellItem){
    name.text = cellItem.name
   } }
 final class CarCellItem { // MARK:- Properties var name: String init(name: String) { self.name = name } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM