我有一个奇怪的问题(在我看来;))考虑了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中显示的图像没有同样的问题。
我希望有人能指出我正确的方向。亲切的问候,桑德
答案 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并返回代表你单元格状态和数据的正确数据对象。