我迅速有一个商店菜单供我的游戏使用。我正在使用UICollectionView来保存项目的视图。购买之前,有一个黑色的玻璃罩在它们上面,当他们购买时,它很明显。我正在存储用于拥有单元格类中某些项目的数据。当我在scrollView中向下滚动,然后单击一个单元格后又回来。与所收集的单元格不同的单元格具有明确的类别,而我先前选择的单元格再次为黑色。
import UIKit
class Shop1CollectionViewCell: UICollectionViewCell {
var owned = Bool(false)
var price = Int()
var texture = String()
@IBOutlet weak var glass: UIImageView!
@IBOutlet weak var ball: UIImageView!
func initiate(texture: String, price: Int){//called to set up the cell
ball.image = UIImage(named: texture)
if owned{//change the glass color if it is owned or not
glass.image = UIImage(named: "glass")
}else{
glass.image = UIImage(named: "test")
}
}
func clickedOn(){
owned = true//when selected, change the glass color
glass.image = UIImage(named: "glass")
}
}
然后我有UICollectionView类
import UIKit
class ShopViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
struct ball{
var price = Int()
var texture = String()
var owned = Bool()
}
var balls = Array<ball>()//This is assigned values, just taken off of the code because it is really long
override func viewDidLoad() {
super.viewDidLoad()
balls = makeBalls(
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return (balls.count - 1)
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Shop1CollectionViewCell
cell.initiate(texture: balls[indexPath.item].texture, price: 1)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! Shop1CollectionViewCell
cell.clickedOn()
}
}
我想知道为什么存储在一个单元格类中的变量会被切换到另一类。
请询问您是否需要我添加任何其他信息或代码。
答案 0 :(得分:2)
您绝对应该实现prepareForReuse
,并将单元格恢复为默认状态-在这种情况下,它将是黑色玻璃,并且没有所有权。
您仍然可以按照在didSelectItemAt
中进行操作的方式来更换玻璃杯,但是我建议视图控制器跟踪每个球的状态。
例如,当调用didSelectItemAt
时-视图控制器将更新存储在self.balls[indexPath.row]
中的球,使其具有owned = true
。
这样,下次调用cellForItemAt
时,通过检查self.balls[indexPath.row].owned
中的值,您将知道玻璃应该是什么颜色。
最后,您要在balls.count - 1
中返回numberOfItems
,这是故意的吗?
在有10个球的情况下,您将只有9个单元。如果要为每个对象都使用一个单元格,则应始终按原样返回计数。
答案 1 :(得分:1)
有时候,您可能必须重写以下功能
override func prepareForReuse(){
super.prepareForReuse()
// reset to default value.
}
类Shop1CollectionViewCell中的,以确保单元格将正确运行。希望你明白了。