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

Swift 3 - Problems in reusing cell with multiple custom cells

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

问题如下:

Swift 想要重新使用旧单元格,但没有正确清除旧单元格中的旧内容。这会导致单元格包含旧内容,尽管我正在向单元格提供新数据。

UITableView 的架构如下:

问题截图:

问卷屏幕截图的开头

向下滚动table:

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

节数-方法

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-方法

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 数组中实际上没有重复吗?如果情况并非如此,那么我能想到的是,您似乎有两个地方使用了一个单选单元格。在其中一个中,您设置了一堆数据,而在另一个中,您似乎没有设置任何数据。我说的是最后一个 else 语句,其中设置 singleChoiceLabel.text 的部分只是被注释掉了。如果满足该条件并且它正在重用为 if 条件的另一个 singleChoiceStructure 分支配置的单元格,则信息仍将从先前的配置中填写。您的 QuestionnaireStructure 对象之一的 questionType 属性 可能拼写错误或只是您未考虑的值,这导致 if 语句命中 else returns 未配置的 QuestionSingleChoice 单元格可能仍有上次使用时的信息。

这里:

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

您需要 "reset" 单元格以防它被重复使用。选项是:

  1. 在单元格中写一个reset()函数,清除任何分配的数据并显示"default"内容,或

  2. 创建一个空 questStruct 并调用 cell.updateCellData(questStruct: questStruct!, indexInTable: indexPath.row)

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