Swift 3 - 重复使用具有多个自定义单元格的单元格的问题

时间:2017-06-16 13:01:21

标签: ios swift uitableview custom-cell

当我在UITableview中向下滚动时,我遇到了问题。该表显示了重复使用单元格时具有旧内容的单元格。

问题如下:

Swift希望重用旧的单元格,但不能正确清除旧单元格中的旧内容。这导致细胞具有旧的内容,尽管我向细胞提供了新的数据。

UITableView的架构,如果如下:

  • 每个自定义单元格都有自己的标识符
  • 每个自定义单元格都在自己的类中分隔

问题截图:

调查问卷屏幕截图的开始

Screen Shot

向下滚动的表格

Screen Shot

这里的问题是" Handedness" -Cell显示单元格编号3(因为重用了单元格),这是不正确的

numberOfSection-Method

override func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

numberOfRowsInSection-Method

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if(section == 0){
        return questionnaireStructure.count
    } else {
        return 1
    }
}

cellForRowAt-Method

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    // first section is the normal Questionnaire
    if(indexPath.section == 0){

        // current questionnaireStructure
        let questStruct:QuestionnaireStructure? = questionnaireStructure[indexPath.row]

        // current cell is a "Headline"
        if(questStruct?.elementtype == "elements/headlines"){
            let cell = tableView.dequeueReusableCell(withIdentifier: "HeadlineStructureCellID", for: indexPath) as! Headline
            cell.headline.text = questStruct?.headline
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell
        } else if(questStruct?.elementtype == "elements/texts"){
            // current cell is a "texts"
            let cell = tableView.dequeueReusableCell(withIdentifier: "TextsStructureCellID", for: indexPath) as! Texts
            cell.textsLabel.text = questStruct?.text
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell
        } else if(questStruct?.questiontype == "Slider"){
            // currrent cell is a "slider-Question"
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionSliderStructureCellID", for: indexPath) as! Slider
            cell.sliderQuestion.text = questStruct?.question
            cell.selectionStyle = UITableViewCellSelectionStyle.none

            let values = (questStruct?.values)!
            let valueArray = values.array as! [Values]
            cell.slider.minimumValue = Float(valueArray[0].min)
            cell.slider.maximumValue = Float(valueArray[0].max)
            let answers = (questStruct?.answers)!
            let answerArray = answers.array as! [Answers]
            cell.minLabel.text = answerArray[0].label
            cell.maxLabel.text = answerArray[1].label

            return cell
        } else if(questStruct?.questiontype == "SingleChoice"){
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionSingleChoiceStructureCellID", for: indexPath) as! SingleChoiceCell
            let radioButtonController = SSRadioButtonsController()
            radioButtonController.delegate = self
            radioButtonController.shouldLetDeSelect = true
            cell.radioButtonController = radioButtonController
            cell.updateCellData(questStruct: questStruct!, indexInTable: indexPath.row)

            return cell
        } else if(questStruct?.questiontype == "MultipleChoice"){
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionMultipleChoiceStructureCellID", for: indexPath) as! MultipleChoiceCell
            cell.multQuestionLabel.text = questStruct?.question
            cell.questStruct = questStruct

            return cell
        } else if(questStruct?.questiontype == "YesNoSwitch"){
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionYesNoSwitchStructureCellID", for: indexPath) as! YesNoSwitch
            cell.yesNoQuestion.text = questStruct?.question
            cell.selectionStyle = UITableViewCellSelectionStyle.none

            return cell
        } else if(questStruct?.questiontype == "TextDate"){
            let cell = tableView.dequeueReusableCell(withIdentifier: "Datepicker", for: indexPath) as! DatePicker
            cell.question.text = questStruct?.question
            cell.selectionStyle = UITableViewCellSelectionStyle.none

            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionSingleChoiceStructureCellID", for: indexPath) as! SingleChoiceCell
            //cell.singleChoiceLabel.text = questStruct?.question
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell
        }

    } else {
        //last section is the save button
        // show the save button when the Questionnaire is loaded
        if(questionnaireStructure.count != 0){
            let cell = tableView.dequeueReusableCell(withIdentifier: "SaveStructureCellID", for: indexPath) as! SaveQuestionnaire
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "TextsStructureCellID", for: indexPath) as! Texts
            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell
        }
    }

}

我检查了什么:

  • " questStruct"的数据正在提供最新数据
  • 覆盖" prepareForReuse" -Methode但没有成功

2 个答案:

答案 0 :(得分:2)

下面:

    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionSingleChoiceStructureCellID", for: indexPath) as! SingleChoiceCell
        //cell.singleChoiceLabel.text = questStruct?.question
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        return cell
    }

如果要重复使用,您需要“重置”该单元格。选项包括:

  1. 在单元格中编写reset()函数,清除所有已分配的数据并显示“默认”内容,或

  2. 创建一个空的questStruct并致电cell.updateCellData(questStruct: questStruct!, indexInTable: indexPath.row)

  3. 选项1.可能是最简单和最直接的。

答案 1 :(得分:1)

您确定questStruct数组中的数据实际上没有重复吗?如果情况并非如此,那么我可以想到的是,看起来你有两个地方使用单个选择单元格。在其中一个中你设置了一堆数据,而在另一个中你似乎没有设置任何数据。我正在谈论最后一个声明,你在那里设置了singleChoiceLabel.text,除了它被注释掉了。如果该条件被命中并且它正在重用为if条件的另一个singleChoiceStructure分支配置的单元格,那么仍将从先前的配置中填写该信息。你的一个QuestionnaireStructure对象的questionType属性可能拼写不正确,或者只是你没有考虑的值,这导致if语句命中else,返回一个未配置的QuestionSingleChoice单元格,该单元格可能仍然包含最后一个时间被使用了。