如何在 UITableView 中重复使用单元格?

How cells are reused in UITableView?

我认为我在 UITableView 中重复使用单元格方面遗漏了一些东西。

我有 ViewController 的 TableView 和带有自己的 class 和标识符的自定义单元格。在 cellForRowAt 方法中我使用

let cell: MyCell = myTableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
    cell.objectForCell = myObject

它正常工作,我得到了带有单元格的 TableView。 我也有传递给我手机的对象。在单元格内我有这个代码

var objectForCell : ObjectClass? {
    didSet {
        if let object = objectForCell {
            someLabel.text = object.title
            ....

这也很好用。 但是如果我想给单元格添加一些子视图怎么办?例如,让它成为每个第 3 个单元格。当 TableView 出现时,我在每个第三个单元格中看到了我的子视图,但为什么当我开始向不同方向滚动时,我在每个单元格中都得到了这个子视图?

var objectForCell : ObjectClass? {
    didSet {
        if let object = objectForCell {
            someLabel.text = object.title
            if object.id % 3 == 0 {
               self.addSubview(......)
            }

cellForRowAt 将 return 一个现有的单元格对象,如果有一个单元格对象不再被 table 视图使用的话。如果该单元格在显示时是第三个单元格,则它添加了新的 subview。因此,要使其按预期工作,您必须删除 prepareForReuse 中的子视图,当该单元格从视图层次结构中删除并排入可重用单元格队列时调用该子视图。这样当你调用 dequeueReusableCell 时,你将得到一个没有新子视图的单元格。

但是,一般来说,您想要add/remove cellForRowAt中的子视图(除非有别无选择)。相反,如果您只想在每三个单元格中显示一个特定视图,请将其添加到 initializer 中,将其添加到 hide/unhide 中 cellForRowAt (在您的情况下,在 objectForCell).

所以声明一个属性:

let specialSubview = UIView()

将其添加到 init(或者,如果您使用 nib,则添加到 awakeFromNib)并将其定位:

self.addSubview(specialSubview)
// autolayout constraints, configuring, etc.

然后在objectForCell:

var objectForCell : ObjectClass? {
    didSet {
        if let object = objectForCell {
            someLabel.text = object.title
            if object.id % 3 == 0 {
                specialSubview.isHidden = false
            } else {
                specialSubview.isHidden = true
            }
            ...