我正在尝试使用模型-视图-演示器实现UITableViewController
。由于我是这个概念的新手,我对如何将UITableView's
数据源协议与UIViewController
分开感到非常困惑。
许多文章都同意View+Viewcontroller需要是愚蠢的,只考虑UI及其布局的想法。 另一方面,Presenter 需要成为视图和模型之间的促进者,并实现逻辑,但他们表示不包括 UIKit,因为它不直接操作 UI。这就是我的困惑开始的地方。
当我们实现UITableView时,我们必须实现两个协议:UITableViewDelegate
和UITableViewDataSource
,尤其是数据源。
我假设委托属于视图部分,并在收到用户操作时将事件传递给演示者。
但是,要实现UITableViewDataSource
,我们必须有一些表视图使用的模型。话虽如此,我只能想到两种方式以某种方式融入 MVP。
-
将模型值传递给表示器
UITableView
,并使其在视图中具有只读价值,以便数据源(例如为特定索引创建行)。但后来我认为它违反了 MVP 概念,因为模型值是视图直接访问的。 -
让演示者成为数据源。但是由于Presenter不应该导入UIKit,我认为导入UIKit并实现UITableViewDatasource也违反了MVP概念。
长话短说,我很困惑在哪里以及如何适当地实现 UITable数据源......如果有人非常了解这个概念,请分享您的知识。提前谢谢你!
第一个选项是将适配器模式与 MVP 一起使用。您可以在适配器类中使UITableViewDelegate和UITableViewDataSource保持一致。通过这种方式,您可以将 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 } }