UICollectionViewCells中的变量更改为不同的单元格

时间:2018-10-28 17:31:59

标签: ios swift uicollectionview uicollectionviewcell

我迅速有一个商店菜单供我的游戏使用。我正在使用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()
    }
}

我想知道为什么存储在一个单元格类中的变量会被切换到另一类。

请询问您是否需要我添加任何其他信息或代码。

2 个答案:

答案 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中的

,以确保单元格将正确运行。希望你明白了。