即使在didSet块中设置,表格视图单元格中的UILabel文本也会在滚动时消失

时间:2017-05-29 20:37:52

标签: ios swift uitableview

我的问题:当我向下滚动时,特定单元格中某些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 } 方法,但它没有做任何事情,所以我把它拿出来了。

1 个答案:

答案 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是适当的数字。并不是说我希望在任何人身上盯着代码几个小时,但希望有人会觉得这很有用。