Переменные в UICollectionViewCells изменяются на разные ячейки - PullRequest
0 голосов
/ 28 октября 2018

У меня есть меню магазина для моей игры в Swift.Я использую 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 голосов
/ 28 октября 2018

Вы обязательно должны реализовать prepareForReuse и вернуть ячейку в ее состояние по умолчанию - которое в этом случае будет с черным стеклом и без него.

Вы все еще можете изменить стекло в том жетак же, как вы делаете в didSelectItemAt, но я бы порекомендовал, чтобы контроллер вида отслеживал состояние каждого шара.

Например, когда вызывается didSelectItemAt - контроллер вида будет обновлять мячхранится в self.balls[indexPath.row], чтобы иметь owned = true.

Таким образом, при следующем вызове cellForItemAt вы узнаете, каким должен быть цвет стекла, проверив значение в self.balls[indexPath.row].owned.

Наконец, вы возвращаете balls.count - 1 в numberOfItems, это намеренно?

В случае, если у вас есть 10 шаров, у вас будет только 9 клеток.Если вам нужна ячейка для каждого из ваших объектов, вы всегда должны возвращать счет как есть.

0 голосов
/ 28 октября 2018

Иногда вам может потребоваться переопределить следующую функцию

override func prepareForReuse(){
  super.prepareForReuse()
 // reset to default value.
}

в классе Shop1CollectionViewCell, чтобы гарантировать правильную работу ячеек.Надеюсь, ты понял.

...