2016-09-25 2 views
0

Мне нужно добавить UILabels в UITableViewCell, но его динамическая первая ячейка может иметь 1 ярлык, второй может иметь 4, и я не знаю, перед этим. Поэтому я пробовал этоДинамически добавлять subViews в 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. Но вся эта логика состояния метки является функцией ячейки (которую можно повторно использовать), а не той строки в таблице, которой соответствует ячейка.

Смежные вопросы