Swift 3 - 重复使用具有多个自定义单元格的单元格时出现问题
Swift 3 - Problems in reusing cell with multiple custom cells
我在 UITableview 中向下滚动时遇到问题。 table 在单元格被重复使用时向我显示具有旧内容的单元格。
问题如下:
Swift 想要重新使用旧单元格,但没有正确清除旧单元格中的旧内容。这会导致单元格包含旧内容,尽管我正在向单元格提供新数据。
UITableView 的架构如下:
- 每个自定义单元格都有自己的标识符
- 每个自定义单元格都单独分开 [=69=]
问题截图:
问卷屏幕截图的开头:
向下滚动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"的数据为最新数据
- 重写 "prepareForReuse"-方法但未成功
您确定数据在 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" 单元格以防它被重复使用。选项是:
在单元格中写一个reset()
函数,清除任何分配的数据并显示"default"内容,或
创建一个空 questStruct
并调用 cell.updateCellData(questStruct: questStruct!, indexInTable: indexPath.row)
选项 1. 可能是最简单直接的。
我在 UITableview 中向下滚动时遇到问题。 table 在单元格被重复使用时向我显示具有旧内容的单元格。
问题如下:
Swift 想要重新使用旧单元格,但没有正确清除旧单元格中的旧内容。这会导致单元格包含旧内容,尽管我正在向单元格提供新数据。
UITableView 的架构如下:
- 每个自定义单元格都有自己的标识符
- 每个自定义单元格都单独分开 [=69=]
问题截图:
问卷屏幕截图的开头:
向下滚动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"的数据为最新数据
- 重写 "prepareForReuse"-方法但未成功
您确定数据在 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" 单元格以防它被重复使用。选项是:
在单元格中写一个
reset()
函数,清除任何分配的数据并显示"default"内容,或创建一个空
questStruct
并调用cell.updateCellData(questStruct: questStruct!, indexInTable: indexPath.row)
选项 1. 可能是最简单直接的。