我为我的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()
渲染器:
最后一种颜色是棕色,但通常是黑色。
我哪里出错了?
答案 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