tableViewCell错误的背景颜色

时间:2018-09-29 19:03:37

标签: swift uitableview tableview

我为我的tableView分配了一个ShopViewController,此控制器称为ShopCellClass,以编程方式绘制tableView的每一行。 ShopCellClass打电话给我的shopClass来知道有多少商品出售。

问题出在我的shopClass中,我在单元格的背景中分配了UIColor,但是最后一个单元格的颜色不正确。

我向您展示了我的3个文件的代码:

ShopViewController

class ShopViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(ShopCellClass.self, forCellReuseIdentifier: "CellShop")
    tableView.rowHeight = 155
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return shop.data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:"CellShop") as! ShopCellClass
    cell.drawTheCard(index: indexPath.row)
    return cell
}
}

ShopCellClass

class ShopCellClass : UITableViewCell {

var widthOfCard : CGFloat = 0
var heightOfCard : CGFloat = 0
var cardIsDraw : Bool = false

let cardView = UIView()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.contentView.addSubview(cardView)
    widthOfCard = UIScreen.main.bounds.size.width
    heightOfCard = 155
}

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

func drawTheCard(index : Int){
    if(cardIsDraw == false){
        drawCard(index: index)
        cardIsDraw = true
    }
}

private func drawCard(index: Int){
    cardView.frame = CGRect(x : 0, y : 0, width : widthOfCard, height : heightOfCard)
    cardView.backgroundColor = shop.data[index].color
}
}

ShopClass

class ShopClass {
    var data: [(id : Int, name : String, price : Double, color : UIColor)] = []

    init(){
        self.loadShopData()
    }

    func loadShopData(){
        data.append((id : 1, name : "Pack 1", price : 4.99, color : UIColor(rgb: 0xE08B37)))
        data.append((id : 2, name : "Pack 2", price : 9.99, color : UIColor(rgb: 0xAFAFAF)))
        data.append((id : 3, name : "Pack 3", price : 15.99, color : UIColor(rgb: 0xF3CD00)))
        data.append((id : 4, name : "Pack 4", price : 19.99, color : UIColor(rgb: 0xF20000)))
        data.append((id : 5, name : "Pack 5", price : 24.99, color : UIColor(rgb: 0x000000))) 
    }
}

let shop = ShopClass()

渲染器:

最后一种颜色是棕色,但通常是黑色。

我哪里出错了?

2 个答案:

答案 0 :(得分:1)

因为此变量出队

var cardIsDraw : Bool = false

更改为true,所以当最后一个显示时,它使var为true的顶部棕色显示出队列,因此

if(cardIsDraw == false){
    drawCard(index: index)
    cardIsDraw = true
}

不会运行,这会导致颜色保持棕色并且不会变为黑色,因此,请完全删除if语句和var

答案 1 :(得分:1)

快速解答-从您的代码中删除此检查:

if(cardIsDraw == false){

答案更长的解释:

您假设将为每一行创建ShopCellClass类,这是完全错误的。 UITableView通过仅创建绝对必要数量的Cell类(通常与屏幕上一次可见的行一样多)来优化图形。 当您开始滚动时,从屏幕上消失的实例(它们移到可见区域之外)将被重用,并且相同的实例将用于显示新实例。

这就是为什么您看到新单元格是棕色的原因-因为它正在重用第一行的实例-并且由于检查了if(cardIsDraw == false){而未执行更改颜色的代码。 在您的情况下解决起来很容易-但是了解很多人被这种机制所困住的机制非常重要,这也将数据模型的一些重要部分保留在了这些单元中。

您可以在此处了解更多信息: https://developer.apple.com/documentation/uikit/uitableview/1614878-dequeuereusablecell

在这里: https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html