如何维护tableview滚动以停止重用单元格

时间:2017-03-03 13:28:52

标签: ios swift uitableview

enter image description here我在tableview中有多个部分。我对每个问题都有多个问题和多个答案。在多个答案中,我有一个选项,那就是其他选项(选项)。当我选择其他按钮时,它会显示建议的文本字段。现在我需要在tableview中滚动时保持文本字段的数据和所选选项的(其他)文本。我在下面的代码中使用了所有答案。

if (indexPath.section == 2)
       {
           let cellidentifier="cell3"
           let cell=tableView.dequeueReusableCell(withIdentifier: cellidentifier,for:indexPath as IndexPath)  as! TextfieldTableViewCell

           let object_3:AnswerBaseClass = arrobject_answer[0][indexPath.row]
           //print("arrobject is\(arrobject_answer[0][indexPath.row])")

           if object_3.answer == "O"
           {
                  // cell.lbl_answer.isHidden = true
                   cell.btn_selected.isHidden=true
                   //cell.lbl_answer_height.constant = 0
                   cell.Other_textfield.tag = 101
                   cell.Other_textfield.borderStyle = .line
                   cell.Other_textfield_top.constant = -30
                   cell.Height_2.constant = 30
           }
           else
           {
               cell.lbl_answer?.text = object_3.answer!
               cell.Other_textfield_top.constant = 12
               cell.Height_2.constant = 0
               cell.lbl_answer.isHidden = false
               cell.btn_selected.isHidden=false
               if answer_main_data[0][indexPath.row] == true
               {
                   cell.lbl_answer.tag = indexPath.row
                   cell.btn_selected.isSelected=true
                   if cell.lbl_answer.text == "Other"
                   {
                       for subview in cell.contentView.subviews
                       {
                           subview.removeFromSuperview()
                       }
                       if arrOtherTextfield_2.indices.contains(indexPath.row)
                       {
                           cell.addSubview(arrOtherTextfield_2[indexPath.row])
                       }
                       else
                       {
                           cell.Other_textfield.tag = 1100
                           cell.Other_textfield.borderStyle = .line
                           cell.Height_2.constant = 30
                           arrOtherTextfield_2.append(cell.Other_textfield)
                       }
                   }
                   else
                   {
                       cell.Height_2.constant = 0
                   }
               }
               else
               {
                   cell.Other_textfield_top.constant = 12
                   cell.btn_selected.isSelected=false
                   cell.Height_2.constant = 0
               }
           }
           cell.Other_textfield.borderStyle = .line
           return cell
       }

2 个答案:

答案 0 :(得分:0)

您必须保留(存储在某些字典中)在textfield中输入的数据,否则当您滚动表格并重新加载单元格时它将丢失。如果您不想保留,则应使用滚动视图而不是表格视图。在scrollview中,即使您向上和向下滚动,它也不会重绘UI。

答案 1 :(得分:0)

您需要分离UI和数据。您将数据嵌入到单元格中,当重复使用单元格时,您丢失了数据。

你可以做两件事:

  1. 创建一个ViewModel类,其中包含单元格数据:文本,颜色等。当然,您需要在收到输入时更新ViewModel您可以谷歌“MVVM模式”获取更多信息。即使您的单元格被重用,您的数据在ViewModel对象中也是安全的。
  2. 您可以将单元格保留在Array中,以便不会重复使用。