2016-09-23 56 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