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



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

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

当我们实现UITableView时,我们必须实现两个协议:UITableViewDelegateUITableViewDataSource,尤其是数据源。

我假设委托属于视图部分,并在收到用户操作时将事件传递给演示者。

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

  1. 将模型值传递给表示器UITableView,并使其在视图中具有只读价值,以便数据源(例如为特定索引创建行)。但后来我认为它违反了 MVP 概念,因为模型值是视图直接访问的。

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

长话短说,我很困惑在哪里以及如何适当地实现 UITable数据源......如果有人非常了解这个概念,请分享您的知识。提前谢谢你!

第一个选项是将适配器模式与 MVP 一起使用。您可以在适配器类中使UITableViewDelegateUITableViewDataSource保持一致。通过这种方式,您可以将 tableView 逻辑与 ViewController 分开,并且演示器仍然不会包含 UIKit。

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

private var cellItems: [CarCellItem]

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

在这里,我们不使用从服务器或本地数据库接收的模型;而是从模型创建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 }
}

最新更新