我的问题:当我向下滚动时,特定单元格中某些UILabel上的文本(问题的答案)是空白的(只有第3到第7个标签,因为您将在我的代码中看到第一个和第二个标签总是设置,似乎神奇地工作,无论如何)。它只发生在一些细胞上,对于大多数细胞来说,它们第一次渲染时是正确的(尽管如此)。
我几个小时以来一直在努力解决这个问题,似乎无法解决这个问题。我很确定它与表格单元重用有关,但是我在自定义表格单元格的didSet
块中设置了数据,甚至尝试了prepareForReuse()
覆盖,如下所示:{{3} }。似乎没有什么工作,我仍然有一些单元格(只有一些,而不是全部!)当我滚动浏览tableView时会丢失一些文本。我错过了什么?
以下是我的自定义单元格类didSet
的{{1}}块(如果有帮助,QuestionCustomCell
打印输出确实显示了当我向下滚动时应该在单元格中的正确文本,但它没有渲染):
NSLog
这里是var cellQuestion: Question! {
didSet {
questionLabel.text = cellQuestion.topQuestion
questionLabel.sizeToFit()
//definitely at least 2 answers
switchLabel1.text = cellQuestion.theResponses[0]
switchLabel2.text = cellQuestion.theResponses[1]
if(cellQuestion.theResponses[2] == nil) {
switch3.isHidden = true
switchLabel3.isHidden = true
} else {
switch3.isHidden = false
switchLabel3.text = cellQuestion.theResponses[2]
let questionName : String = cellQuestion.topQuestion
NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[2]!)
}
if(cellQuestion.theResponses[3] == nil) {
switch4.isHidden = true
switchLabel4.isHidden = true
} else {
switch4.isHidden = false
switchLabel4.text = cellQuestion.theResponses[3]
let questionName : String = cellQuestion.topQuestion
NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[3]!)
}
if(cellQuestion.theResponses[4] == nil) {
switch5.isHidden = true
switchLabel5.isHidden = true
} else {
switch5.isHidden = false
switchLabel5.text = cellQuestion.theResponses[4]
let questionName : String = cellQuestion.topQuestion
NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[4]!)
}
if(cellQuestion.theResponses[5] == nil) {
switch6.isHidden = true
switchLabel6.isHidden = true
} else {
switch6.isHidden = false
switchLabel6.text = cellQuestion.theResponses[5]
let questionName : String = cellQuestion.topQuestion
NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[5]!)
}
if(cellQuestion.theResponses[6] == nil) {
switch7.isHidden = true
switchLabel7.isHidden = true
} else {
switch7.isHidden = false
switchLabel7.text = cellQuestion.theResponses[6]
let questionName : String = cellQuestion.topQuestion
NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[6]!)
}
restorePriorAnswer()
}
}
(我使用它以便细胞记住开关在重复使用时是关闭还是打开 - 这确实有效):
restorePriorAnswer()
这是我的func restorePriorAnswer ( )
{
if(cellQuestion.theAnswer != nil)
{
self.cellDelegate.restorePrior(forCell: self, forShortName: cellQuestion.shortName, subAction: "\(cellQuestion.theAnswer!.answerSelect)")
print("Prior answer was \(cellQuestion.theAnswer!.answerSelect)")
switch(cellQuestion.theAnswer!.answerSelect)
{
case 0:
switch1.isOn = true
break
case 1:
switch2.isOn = true
break
case 2:
switch3.isOn = true
break
case 3:
switch4.isOn = true
break
case 4:
switch5.isOn = true
break
case 5:
switch6.isOn = true
break
case 6:
switch7.isOn = true
break
default:
self.cellDelegate.restorePrior(forCell: self, forShortName: "Control", subAction: "restorePriorAnswer (Bad Select Value)")
break
}
}
else
{
switch1.setOn(false, animated: false)
switch2.setOn(false, animated: false)
switch3.setOn(false, animated: false)
switch4.setOn(false, animated: false)
switch5.setOn(false, animated: false)
switch6.setOn(false, animated: false)
switch7.setOn(false, animated: false)
}
}
:
cellForRowAtIndexPath
如果我遗漏了您认为有助于解决问题的任何代码,请告诉我。除了标签之外,其他所有工作都有效 - 开关记住它们在来回滚动时是打开还是关闭,如果答案数组中的相应插槽为零,则隐藏相应的开关,而所有其他文本都应该是 - 除了一些答案的标签,这是问题。正如我所提到的,我尝试了func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:QuestionCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuse, for: indexPath) as! QuestionCustomCell
if((currentQuestion?.canSubsume())!) {
if((currentQuestion?.shouldDoSubsume())!) {
//since this apparently refreshes random rows, we need to hard-code which row goes where
if(indexPath.row == 0) {
cell.cellQuestion = currentQuestion
} else {
let rowQuestion: Question = (currentQuestion?.getSubsumeList().getQuestion(shortID: currSubsumeArray![indexPath.row - 1]))!
cell.cellQuestion = rowQuestion
}
} else {
//there should only be one cell at this point - the first one
cell.cellQuestion = currentQuestion
//print out the first question, just to make sure...
let logStringOne : String = "the current question: " + (currentQuestion?.topQuestion)!
NSLog(logStringOne)
let logString : String = "the first subsumed question: " + (currentQuestion?.subsumeList!.firstQuestion)!
NSLog(logString)
}
} else {
cell.cellQuestion = currentQuestion
}
cell.selectionStyle = UITableViewCellSelectionStyle.none
cell.cellDelegate = self
return cell
}
方法,但它没有做任何事情,所以我把它拿出来了。
答案 0 :(得分:0)
我道歉,它盯着我看了几个小时,我没有意识到。在didSet
块中,如果不应该使用它们,我隐藏了标签,如下所示:
if(cellQuestion.theResponses[2] == nil) {
switch3.isHidden = true
switchLabel3.isHidden = true
} else {
switch3.isHidden = false
switchLabel3.text = cellQuestion.theResponses[2]
}
但在else
区块中,我没有取消隐藏它们......当一个单元格被装入新鲜而没有重复使用时,它没有任何问题,因为标签以前从未被隐藏过。但是在重复使用的细胞中,它是,因此对于那些被重复使用的细胞来说,标签不存在。
因此,这些if/else
块中的每一个都应该包含switchLabelx.isHidden = false
,其中x是适当的数字。并不是说我希望在任何人身上盯着代码几个小时,但希望有人会觉得这很有用。