动态添加子视图到UITableViewCell
问题描述:
我需要将UILabels添加到UITableViewCell,但其动态的第一个单元格可以有1个标签,第二个可以有4个,而我之前不知道。所以我试过这个动态添加子视图到UITableViewCell
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {
let cell: ReviewTableViewCell = reviewTableView.dequeueReusableCell(withIdentifier: "Review", for: indexPath) as! ReviewTableViewCell
var reviewObj:Review!
reviewObj = reviewArray[(indexPath as NSIndexPath).row]
let viewsAdded = commentViewsAddedDict[indexPath.row]
if(viewsAdded == nil)
{
for comment in reviewObj.commentArray
{
let label1 = UILabel()
label1.text = “text1”
label1.textColor = UIColor(hexString: "#333333")
let label2 = UILabel()
label2.text = “text2”
label2.numberOfLines = 0
label2.sizeToFit()
label2.textColor = UIColor(hexString: "#666666")
let label3 = UILabel()
label3.text = "----------------------------------------------------------------------"
label3.textColor = UIColor(hexString: "#eeeeee")
cell.stackView1.addArrangedSubview(label1)
cell.stackView1.addArrangedSubview(label2)
cell.stackView1.addArrangedSubview(label3)
}
commentViewsAddedDict[indexPath.row] = true
}
return cell
}
但是会发生什么,先前添加的视图不会被删除,它会再次尝试添加新的视图。
所以我想知道,做到这一点的有效方法是什么。其次,我出错的地方。
问候 兰吉特
答
您正在使用commentViewsAddedDict
弄清楚是否行已添加或不。但是,不管这些标签是否被添加,都不是表格中的行的功能,而是单元格的功能,它被重用。
所以,我会建议:
消除这种
commentViewsAddedDict
逻辑;和移动关于已将多少个标签添加到
ReviewTableViewCell
的逻辑。
所以,你可能最终得到:
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {
let cell = reviewTableView.dequeueReusableCell(withIdentifier: "Review", for: indexPath) as! ReviewTableViewCell
var reviewObject = reviewArray[(indexPath as NSIndexPath).row]
cell.updateLabels(for: reviewObject)
return cell
}
而且在ReviewTableViewCell
:
func updateLabels(for reviewObject: ReviewObjectType) {
// add label if needed
// update label `text` if needed
// remove any labels that need to be removed
}
这是一个有点难以具体的逻辑updateLabels
为所提供的代码片段在这个问题上还不清楚,但基本的想法是,ReviewTableViewCell
应该跟踪其标签是否已被添加,并且基于reviewObject
,决定是否需要添加标签,更新现有标签或删除此特定reviewObject
不需要的任何标签。但是,所有这种“标签状态”逻辑都是单元格的函数(可以重用),而不是单元格对应的表格中的哪一行。