将单元格添加到动态UITableView数据源|迅速

时间:2020-02-19 06:17:01

标签: swift uitableview model datasource

我有一个动态UITableViewDataSource,其中包含一个模型和一个UITableViewCell

我想在'nth'(例如第十)行中插入其他UITableViewCell ...(对于Google Ads)

数据源

class ModelTableViewDataSource<Model, Cell: UITableViewCell>: NSObject, UITableViewDataSource {

    typealias CellConfigurator = (Model, Cell) -> Void

    var models: [Model]

    private let reuseIdentifier: String
    private let cellConfigurator: CellConfigurator

    init(models: [Model], reuseIdentifier: String, cellConfigurator: @escaping CellConfigurator) {
        self.models = models
        self.reuseIdentifier = reuseIdentifier
        self.cellConfigurator = cellConfigurator
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return models.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = models[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier) as! Cell
        cellConfigurator(model, cell)
        return cell
    }
}

然后我为每个模型添加一个扩展名

模型

extension ModelTableViewDataSource where Model == SomeModel, Cell == SomeCell {
    static func make(for someModel: [SomeModel], reuseIdentifier: String = "Identifier") -> ModelTableViewDataSource {
        return ModelTableViewDataSource(models: someModel, reuseIdentifier: reuseIdentifier) { (someModel, someCell) in
            someCell.model = someModel
        }
    }
}

实现此目的的最佳方法是保持UITableViewDataSource

的可重用功能

1 个答案:

答案 0 :(得分:0)

我想到了这个

  • 创建一个子类
  • 覆盖numberOfRowsInSection以返回行数+ 1
  • 覆盖cellForRowAt以处理第十行

    ModelTableViewDataSourceWithAd类:ModelTableViewDataSource {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return super.tableView(tableView, numberOfRowsInSection:section) + 1
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if (indexPath.row == 9) {
            // return Google ad cell
        } else {
            return super.tableView(tableView, cellForRowAt:indexPath)
        }
    }
    

    }

然后是创建者:

extension ModelTableViewDataSource where Model == SomeModel, Cell == SomeCell {

// ...

    static func makeWithAd(for someModel: [SomeModel], reuseIdentifier: String = "Identifier") -> ModelTableViewDataSource {
        return ModelTableViewDataSourceWithAd(models: someModel, reuseIdentifier: reuseIdentifier) { (someModel, someCell) in
            someCell.model = someModel
        }
    }

}