子类化的UITableViewCell子视图颜色

3

我遇到了一个奇怪的问题(在我看来是奇怪的),涉及到uitableview单元格的子类。我的子类代码如下:

class SubLevelTableCell: UITableViewCell {
    var subLevelLabel:UILabel
    var subLevelBack:UIView
    var subLevelScore:UIImageView

    override init(style: UITableViewCellStyle, reuseIdentifier: String!)
    {
        self.subLevelBack = UIView()
        self.subLevelLabel = UILabel()
        self.subLevelScore = UIImageView()

        super.init(style: UITableViewCellStyle.Value1, reuseIdentifier: reuseIdentifier)

        self.subLevelLabel.textColor = whiteColor

        self.subLevelLabel.font = UIFont(name: subLevelLabel.font.fontName, size: 20)

        self.addSubview(self.subLevelBack)
        self.subLevelBack.addSubview(self.subLevelLabel)
        self.subLevelBack.addSubview(self.subLevelScore)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        self.subLevelBack.frame = CGRectMake(10, 10, self.bounds.size.width-20, self.bounds.size.height-20)
        self.subLevelLabel.frame = CGRectMake(5, 0, subLevelBack.frame.size.width/2-10, subLevelBack.frame.size.height)
        self.subLevelScore.frame = CGRectMake(subLevelBack.frame.size.width-120, 15, 100, subLevelBack.frame.size.height-30)
    }

}

现在我在我的视图控制器中按以下方式创建这些单元格:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:SubLevelTableCell? = SubLevelTable?.dequeueReusableCellWithIdentifier("Cell") as? SubLevelTableCell
        if (cell == nil)
        {
            cell = SubLevelTableCell(style: UITableViewCellStyle.Subtitle,
                reuseIdentifier: "Cell")
            cell!.backgroundColor = grayColor
        }
        if (indexPath.row == 0){nextLevelCanBePlayed = true}
        if(nextLevelCanBePlayed){
            canBePlayedArray[indexPath.row] = true
            cell!.subLevelBack.backgroundColor = blueColor
        }else{
            canBePlayedArray[indexPath.row] = false
            cell!.subLevelBack.backgroundColor = redColor
        }
        cell!.subLevelLabel.text = "Stage \(indexPath.row+1)"
        let data = db.query("SELECT * FROM LEVEL_DETAIL WHERE MAIN_LEVEL =\(MainLevelNr!) AND SUB_LEVEL = \(indexPath.row+1)")[0]
        var levelScore: Int = 0
        if let columnValue = data["COMPLETED"]{
            levelScore = columnValue.asInt()
            if (levelScore > 0){nextLevelCanBePlayed = true}else{nextLevelCanBePlayed = false}
            cell!.subLevelScore.image = UIImage(named: "\(levelScore)Stars.png")
        }
        return cell!
    }

我的问题是,当视图首次加载时,subLevelBack.backgroundColor被正确设置,即子视图的颜色正确。但是当我开始滚动时,不同的单元格会出现背景颜色不正确的情况,我不知道如何解决这个问题。顺便说一下,UIImageView中显示的图像没有这个问题。希望有人能指点我方向。谢谢,Sander。

你的条件语句不需要加括号:if(nextLevelCanBePlayed){ 应该写成 if nextLevelCanBePlayed { - hlfcoding
根据你的代码,sublevelBack.backgroundColor应该有什么预期行为?对于第一个单元格来说,它将始终是蓝色,而对于其他所有单元格来说,它将是红色? - hlfcoding
括号确实是可选的,但我更喜欢使用它们以提高可读性。实际上,每一行代表一个级别,只有当完成级别n时,级别n+1才能被玩(变成蓝色)。第一级别始终可以玩,因此确实始终是蓝色的。如果级别不可玩,则背景为红色。因此,当插入第1行时,我会检查是否完成了第1级别,然后设置bool nextLevelCanBePlayed的值。当插入第2行时,它会检查bool值以确定其背景颜色。 - Sander Frenken
我明白了。此外,在每个单元格重新渲染时查询您的数据库可能会影响性能。 - hlfcoding
1个回答

1
if (indexPath.row == 0){nextLevelCanBePlayed = true}
if(nextLevelCanBePlayed){ ...

上述代码似乎不正确。您正在尝试跟踪已播放的关卡数量,但每次重新渲染第一个单元格时,nextLevelCanBePlayed 将被重置。也许尝试只使用 if(nextLevelCanBePlayed || indexPath.row == 0){
另一件事是您假设表视图将按顺序重新渲染其靠近视口的单元格,但这在任何地方都没有记录,并且很可能不可靠,特别是如果您向相反方向滚动。因此,当表视图重新构建单元格4(nextLevelCanBePlayed 计算并设置为false),然后可能返回到单元格3,即使3实际上可以播放,nextLevelCanBePlayed 仍将为false,3将显示不正确。随着您向上和向下滚动,颜色开始出现错误变化,这就开始有意义了。
我的建议是正确使用您的 UITableViewDataSource 方法,并使用这些方法来处理数据库并返回表示单元格状态和数据的正确数据对象。

是的,我明白你的意思,谢谢。我将在viewdidload中创建一个整数数组(levelScoreArray),并将此数组用作数据源。因此,索引路径i处的单元格将使用levelScoreArray [i]来设置其颜色和图像。我想这应该可以解决问题。不幸的是现在无法修复它,但我会在今晚处理,并在它能正常工作时接受您的答案!暂时先谢谢您。 - Sander Frenken
谢谢,现在运行得很好。我现在看到这是一个有点愚蠢的问题。 - Sander Frenken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接