什么是处理数据和UITableViewCell的更好方法?

时间:2019-01-23 19:05:22

标签: ios swift uitableview uiviewcontroller

我想了解构建应用架构的正确方法。我读了很多。我正面临着两种不同的方法。而且,每种方法的普及程度似乎都是五十。

第一个-使用ViewController或TableViewController中的数据配置单元格

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! TableViewCell

    cell.title.text = "Some text"
    // config other data...

    return cell
}

第二个-通过协议配置单元格

protocol SomeCellProtocol {
    func setTitle(text: String)
}

class SomeCell: UITableViewCell {

    @IBOutlet weak var title: UILabel!    
}

extension SomeCell: SomeCellProtocol {

    func setTitle(text: String) {
        title.text = text
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! TableViewCell

    cell.setTitle(text: "Some text")
    // config other data...

}

所以问题是:

  • 哪种方法更好?还是两种情况都可以?
  • 是否认为我们通过第二种方法方法传递数据以进行查看?
  • 我可以说,如果有一个,我们有被动视图,但有第二个,不是吗?

2 个答案:

答案 0 :(得分:3)

它们的工作原理相同,但是在protocol

中有一点优势

1-重用其他单元格。

2-全部cellForRowAt

3-将来,当您直接使用函数而不是直接访问@IBOutlets并直接对其进行编辑时,速度会稍有加快,这将使错误率降至最低,因为您仅限于protocol

4-您可以使用它而无需完全创建单元格,这非常有用,当您只想在UIViewController中真正快速地创建所有内容然后创建自定义单元格时。

问题2: 将数据传递到单元格非常适合使用干净的代码,因为您可以创建尽可能多的多态函数来将数据直接处理到单元格中,而不是在if else内手动func cellForRowAt进行处理。

例如:

protocol configurable {
 func configure(dataForm: SomeObject)
 func configure(dataForm: SomeOtherObject)
}

问题3:

  

被动视图。屏幕和具有所有特定于应用程序行为的组件被提取到控制器中,从而使小部件的状态完全由控制器控制。

他们都是被动的。

答案 1 :(得分:1)

关于问题2:

我相信,如果我们继续使用协议而不是要传输的对象,那么我们可以改进版本“通过协议配置单元”。

from operator import truth

t = list(filter(truth, (manhattan(listA, i) for i in listB)))

然后我们使用protocol DataForCellProtocol { func getTitle()->String? func getDescription()->String? ... } 创建CellConfigureProtocol

DataFromCellProtocol

现在要为任何数据构建一个单元,您只需要为它们实现protocol CellConfigureProtocol{ func configureCell(with obj: DataForCellProtocol) } 。现在我们可以确定我们拥有被动视图。