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