如何在UITableView中重用单元格?



我认为我错过了一些东西,以至于在我的UITableView中重复使用单元格。

我有带有 TableView 的视图控制器和具有自己的类和标识符的自定义单元格。在单元格中,我使用的方法

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

它正常工作,我得到了带有单元格的表格视图。 我也有对象传递给我的牢房。在单元格内,我有这个代码

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

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

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

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

但是,通常,您不希望cellForRowAt中添加/删除子视图(除非没有其他选项)。相反,如果它只是您想要在每三个单元格中显示的单个特定视图,请将其添加到initializer中并在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
}
...

最新更新