子类化uitableviewcell子视图颜色

时间:2014-10-05 21:17:54

标签: uitableview swift

我有一个奇怪的问题(在我看来;))考虑了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 btw中显示的图像没有同样的问题。

我希望有人能指出我正确的方向。亲切的问候,桑德

1 个答案:

答案 0 :(得分:1)

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

以上代码似乎不正确。您正在尝试跟踪已播放的级别数,但每次重新呈现第一个单元格时,nextLevelCanBePlayed将被重置。也许只试试if(nextLevelCanBePlayed || indexPath.row == 0){

另一件事是你假设桌面视图会按顺​​序在视口附近重新渲染其单元格,但是在任何地方都没有记录,很可能不可靠,如果您正在反向滚动,则特别有可能。因此,当表视图重新构建单元格4(nextLevelCanBePlayed计算并设置为false)并且可能接着返回到单元格3时,即使3实际上可以播放,nextLevelCanBePlayed也将为假,3将显示不正确。然后,当你向上和向下滚动时,它开始意识到你的颜色开始不规律地变化。

我的建议是正确使用你的UITableViewDataSource方法并使用它们来处理db并返回代表你单元格状态和数据的正确数据对象。