我认为我错过了一些在我的UITableView中重用单元格的方法。
我有ViewView的ViewController和带有自己的类和标识符的自定义单元格。在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(......)
}
答案 0 :(得分:3)
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
}
...