我想确认我采用的方法解决了UITableView
中自定义单元格的问题,因为它滚动使得单元格不包含旧单元格的数据...
包含UITableView
个自定义UITableViewCells
的应用(" CustomCell")。每个CustomCell都包含一个UIStackView
,其中包含一个或多个通过笔尖定制的自定义视图(" CustomView")。我重复使用CustomCell如下:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierCustomCell, forIndexPath: indexPath) as! CustomCell
configureCell(cell, atIndexPath: indexPath)
return cell
}
问题是该单元格将包含" old"细胞被重复使用的数据。要解决此问题,我将在CustomCell中覆盖prepareForReuse
方法,如下所示:
override func prepareForReuse() {
super.prepareForReuse()
for case let view as CustomView in stackView.subviews {
view.removeFromSuperview()
}
}
然后在layoutSubviews
中,我将子视图添加回来:
override func layoutSubviews() {
super.layoutSubviews()
if stackView.subviews.isEmpty {
addCustomViewsToCell()
}
}
到目前为止,性能似乎很好,但是如果这是一种正确的方法,或者如果我将来会遇到规模问题,那就很好奇。到目前为止,我还没有找到另一种可行的方法。
由于
答案 0 :(得分:0)
您重复使用单元格的代码是正确的。一种常见的方法是通过在自定义单元格上设置变量或调用函数来在cellForRowAtIndexPath
函数中配置单元格数据:
let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierCustomCell, forIndexPath: indexPath) as! CustomCell
cell.data = myData[indexPath.row] // where myData is an array of type [Data]
return cell
您的单元格将负责其自己的布局以显示新数据:
var data: Data {
didSet {
// configure and refresh your UI here
}
}
我怀疑您的问题与您的configureCell
功能有关。如果可以,请将此代码移到单元格的逻辑中。这将更清晰,更容易理解。
就性能而言,如果您的堆栈视图中没有太多内容,您现在可能会很好,但如果它们的复杂性不断增加,您可能会看到旧设备上的帧速率下降。