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小时。如果没有反转,请使用版主标志解释否决票。