【发布时间】:2016-06-18 02:05:22
【问题描述】:
我正在制作一个在 GameScene 底部有一个 collectionView 角色选择的游戏。许多字符被锁定,因此我将“锁定”图像显示为集合视图单元格图像。但是,当用户解锁角色并再次加载 GameScene(移动到 gameOver 场景,重新启动游戏以呈现 GameScene)时,我需要更新 collectionView 单元格图像并将“锁定”图像换成常规图像。我尝试了很多不同的东西,但它不起作用。它不会换出/重新加载新图像。我知道它只是我缺少的一些小东西,但这是我与集合视图关联的所有代码。
class CharactersCollectionViewCell: UICollectionViewCell {
//MARK : Public API
var characters : NACharacters!{
didSet{
updateUI()
}
}
//MARK : Private
@IBOutlet weak var featuredImageView: UIImageView!
private func updateUI(){
self.layer.borderColor = UIColor.whiteColor().CGColor
self.layer.borderWidth = 2.5
self.layer.masksToBounds = true
self.layer.cornerRadius = CGFloat(roundf(Float(self.frame.size.width/2.0)))
featuredImageView.image = characters.featuredImage
}
}
class NACharacters {
var featuredImage : UIImage!
static var characterLineUp = [NACharacters]()
init(featuredImage: UIImage){
self.featuredImage = featuredImage
}
static func createCharacters() -> [NACharacters]{
print("Inside create character")
characterLineUp.insert(NACharacters(featuredImage: UIImage(named: "DiploSquadCollectionView")!), atIndex: 0)
characterLineUp.insert(NACharacters(featuredImage: UIImage(named: "LockedNBAPlayersCollectionView")!), atIndex: 1)
if(NSUserDefaults().unlockNBAPlayers == true){
characterLineUp[1].featuredImage = UIImage(named: "NBAPlayersCollectionView")!
}
characterLineUp.insert(NACharacters(featuredImage: UIImage(named: "LockedLeanSquadCollectionView")!), atIndex: 2)
if(NSUserDefaults().totalDabs >= 10000){
print("setting up lean to be unlocked")
characterLineUp[2].featuredImage = UIImage(named: "LeanSquadCollectionView")!
}
return characterLineUp
}
}
//Inside Game View Controller
@IBOutlet var collectionView: UICollectionView!
//MARK : Data Source
internal var characters = NACharacters.createCharacters()
extension GameViewController : UICollectionViewDataSource, UICollectionViewDelegate{
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return characters.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Storyboard.CellIdentifier, forIndexPath: indexPath) as! CharactersCollectionViewCell
cell.characters = self.characters[indexPath.item]
return cell
}
//Inside Game Scene
var collectionView: UICollectionView? {
return self.view?.subviews.filter{ $0 is UICollectionView }.first as? UICollectionView
}
override func didMoveToView(view: SKView) {
//INSIDE HERE I NEED TO UPDATE THE COLLECTION VIEW CELL IMAGES
}
我知道这看起来有很多代码,但其中大部分都是非常标准的。我向您展示了所有这些,以便我们可以准确指出哪里出了问题或需要做什么才能使其正常工作。这是我与 collectionView 关联的所有代码。
【问题讨论】:
-
你不应该过滤你自己的子类控制器的子视图来找到collectionView。你能分享
Inside Game Scene相对于Inside Game View Controller的层次结构吗? -
@kezi 我过滤了子视图,因为当游戏重新启动时,它会将 collectionView 设置为 nil,这解决了这个问题。但是,我认为这与我现在遇到的 CollectionViewCell 图像问题无关。Inside Game Scene 的层次结构是什么意思。抱歉,我对 swift 有点陌生哈哈。
-
是的,我只是说您可以保留对集合视图的引用,这样您就不必猜测
?可选。我所说的层次结构是指哪个视图在哪个视图中。场景是否在控制器的视野内?集合视图是否在同一个视图中?
标签: ios swift uicollectionview