gpt4 book ai didi

ios - 即使在 didSet block 中设置, TableView 单元格中的 UILabel 文本也会在滚动时消失

转载 作者:行者123 更新时间:2023-11-30 12:25:41 25 4
gpt4 key购买 nike

我的问题:当我向下滚动时,特定单元格中的一些 UILabels(问题的答案)上的文本为空白(只有第三个到第七个标签,正如您在我的代码中看到的第一个和第二个标签)总是被设置并且似乎无论如何都能神奇地工作)。它只发生在某些单元格上,而对于大多数单元格来说,当它们第一次渲染时它是正确的(但并不总是如此)。

我已经为此苦苦挣扎了几个小时,但似乎无法解决它。我很确定这与表格单元格重用有关,但我在自定义表格单元格的 didSet block 中设置了数据,甚至尝试了 prepareForReuse() 覆盖正如这里建议的:Stop the reuse of custom cells Swift 。似乎什么都不起作用,我仍然有一些单元格(只有一些,不是全部!)当我滚动我的 tableView 时丢失了一些文本。我错过了什么?

这是我的自定义单元类 QuestionCustomCelldidSet block (如果有帮助,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
}

如果我缺少任何您认为有助于解决问题的代码,请告诉我。除了标签之外,其他所有内容都有效 - 开关会记住来回滚动时它们是打开还是关闭,如果答案数组中相应的插槽为零,则隐藏相应的开关,并且所有其他文本都应如此 - 除了某些答案的标签,这就是问题所在。正如我提到的,我尝试了 prepareForReuse() 方法,但它没有执行任何操作,因此我将其取出。

最佳答案

我很抱歉,它盯着我看了好几个小时,而我却没有意识到。在 didSet block 中,如果不应该使用标签,我会隐藏它们,如下所示:

if(cellQuestion.theResponses[2] == nil) {
switch3.isHidden = true
switchLabel3.isHidden = true
} else {
switch3.isHidden = false
switchLabel3.text = cellQuestion.theResponses[2]
}

但在 else block 中,我没有取消隐藏它们...当单元格重新加载且未重复使用时,它没有问题,因为标签以前从未被隐藏过。但在重复使用的单元格中,确实如此,因此那些重复使用的单元格不存在标签。

因此,每个 if/else block 中都应该有一个 switchLabelx.isHidden = false,其中 x 是适当的数字。我并不是想花几个小时盯着任何人的代码,但希望有人会发现这很有用。

关于ios - 即使在 didSet block 中设置, TableView 单元格中的 UILabel 文本也会在滚动时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44250012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com