2016-09-23 51 views
1

我需要垂直添加标签并且它们的编号是动态的。现在它可以正常使用此代码:TableViewCell中元素的动态数量

let numUnitsLabel = UILabel(frame: CGRectZero) 
numUnitsLabel.text = units 
numUnitsLabel.font = UIFont.boldSystemFontOfSize(28) 
numUnitsLabel.textColor = UIColor.redColor() 
numUnitsLabel.translatesAutoresizingMaskIntoConstraints = false 
cell.contentView.addSubview(numUnitsLabel) 

let topConstraint = NSLayoutConstraint(item: numUnitsLabel, attribute: .Top, relatedBy: .Equal, toItem: cell.contentView, attribute: .Top, multiplier: 1, constant: 8 * CGFloat(i+1) + CGFloat(i*25) + CGFloat(i*20) - 5) 
let rightConstraint = NSLayoutConstraint(item: numUnitsLabel, attribute: .Trailing, relatedBy: .Equal, toItem: cell.contentView, attribute: .Trailing, multiplier: 1, constant: -10) 

cell.contentView.addConstraints([topConstraint, rightConstraint]) 

单元格绘制正常。但是,当我在列表中添加新项目并致电tableView.reloadData时,旧标签被“记住”并且它们超过了新标签。新添加的对象放在数组中的第一个位置,它们就像一个在另一个...也许我的方法是不好的,但如果你有任何建议,请指教我。

+0

您可以继承tableviewcell并在prepareforreuse方法中删除子视图。 –

+0

好的,但在循环中我有上面的代码,所以基本上我添加标签X次。我subclassed prepareForReuse现在如何删除所有这些? – Slavcho

+0

如果你的标签是在类中定义的,你可以说numUnitsLabel.removeFromSuperview()。如果你想删除单元格中的所有内容: 以查看contentView { view.removeFromSuperview() } –

回答

1

请记住,细胞是重复使用的,所以不管细胞先前是否准备好,它仍然具有所有这种状态。特别是,它的视图层次结构(添加子视图)仍然存在。其原因通常是表格单元格的布局保持不变,并且只有其内容意在重新设置在cellForRowAtIndexPath中。

您正在使用反模式,首先,这就是您遇到困难的原因。

如果你真的想清除和重新布局单元格,明确删除所有子视图,每一次,如:

https://techfuzionwithsam.wordpress.com/2014/12/23/what-is-the-best-way-to-remove-all-subviews-from-parent-viewsuper-view/

我怀疑,虽然,(当然这不是代码审查),其你的设计是有缺陷的。通常,表格单元不需要随着内部元素的动态计数而在高度上增长。您可能需要嵌套表格(!!),实际上只是一个多行的UITextView,或者是由具有自定义节标题视图的部分构成的表格。

+0

是的,它可以删除所有cell.contentView的UIViews。但我知道这种方法很糟糕,但至少这是正确的答案。 – Slavcho