Swift tableViewCell背景颜色错误

Swift tableViewCell背景颜色错误,swift,uitableview,tableview,Swift,Uitableview,Tableview,我有一个tableView分配给我的ShopViewController这个控制器称为ShopCellClass,以编程方式绘制tableView的每一行。ShopCellClass打电话给我的shopClass,想知道卖出了多少物品 问题是在我的shopClass中,我在单元格的背景中指定了UIColor,但最后一个单元格的颜色不正确 我将向您显示我的3个文件的代码: ShopViewController: class ShopViewController: UIViewController,

我有一个
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
}
}
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()
ShopClass

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
}
}
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()
渲染:

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


我哪里出错了

因为该变量已退出队列

var cardIsDraw : Bool = false
将更改为
true
,因此当最后一个显示时,将var为
true
的顶部棕色列出来,因此

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

不会运行,这会导致颜色保持棕色而不会变为黑色,因此完全删除if语句和var,因为该var将退出队列

var cardIsDraw : Bool = false
将更改为
true
,因此当最后一个显示时,将var为
true
的顶部棕色列出来,因此

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

不会运行导致颜色保持棕色而不会变为黑色的命令,因此请完全删除if语句和var

快速回答-从代码中删除此检查:

if(cardIsDraw==false){

请给出详细解释:

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

这就是为什么您看到新的单元格是棕色的——因为它正在重用第一行的实例——并且由于您检查了
if(cardIsDraw==false){
更改颜色的代码没有执行。 在你的案例中,这很容易修复,但了解机制非常重要,因为很多人都被困在这些单元中,将数据模型的一些重要部分保留在这些单元中

您可以在此处阅读更多信息:

在这里:

快速回答-从代码中删除此检查:

if(cardIsDraw==false){

请给出详细解释:

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

这就是为什么您看到新的单元格是棕色的——因为它正在重用第一行的实例——并且由于您检查了
if(cardIsDraw==false){
更改颜色的代码没有执行。 在你的案例中,这很容易修复,但了解机制非常重要,因为很多人都被困在这些单元中,将数据模型的一些重要部分保留在这些单元中

您可以在此处阅读更多信息:

在这里:

细胞被重复使用。棕色细胞被重复使用,并且在
cardIsDraw
之后(更好
cardIsDrawn
)设置为
true
颜色将不再改变。顺便说一句:框架推断单元格的宽度和高度。显式设置是多余的。不要在帖子中发布辱骂性内容。否决票会自动反转。下次等待24小时。如果没有反转,请使用主持人标志解释否决票。Cells被重复使用。棕色单元格被重复使用,并且在
cardIsDraw
之后(更好
cardIsDrawn
)设置为
true
颜色将不再改变。顺便说一句:框架推断单元格的宽度和高度。明确设置是多余的。不要在帖子中发布辱骂性内容。否决票会自动反转。下次等待24小时。如果没有反转,请使用版主标志解释否决票。