2016-09-25 141 views
0

我需要将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 
    } 

但是会发生什么,先前添加的视图不会被删除,它会再次尝试添加新的视图。

所以我想知道,做到这一点的有效方法是什么。其次,我出错的地方。

问候 兰吉特

回答

0

您正在使用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不需要的任何标签。但是,所有这种“标签状态”逻辑都是单元格的函数(可以重用),而不是单元格对应的表格中的哪一行。