【问题标题】:Swift: Update CollectionView Cell ImageSwift:更新 CollectionView 单元格图像
【发布时间】: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


【解决方案1】:

你有没有在同一个地方尝试过这个 ::

imageView.image = nil

然后将要更新的图像设置为..

imageView.image = UIImage(named : "YourImage")

【讨论】:

  • 是的。我尝试在 didMoveToView 函数内部做类似的事情。没用。
  • 我相信这个问题与移动到 GameOverScene 然后回到 GameScene 有关。它不能重新加载单元格。您可以在 GameScene 中看到,我必须声明“collectionView”并返回,以便在游戏结束后再次呈现 GameScene 时它​​不为零。
  • 1> 尝试在 viewWillAppear() 中重新加载 collectionView 如果它不起作用然后 2> 如果需要,在 itemAtIndexPath() 中设置逻辑使用 NSUserDefault()。先搞清楚问题。这是 99% 的重用单元问题..
  • 我没有 viewWillAppear 功能。您可以使用 NSUserDefault() 编辑您的答案以在 itemAtIndexPath() 中包含逻辑吗?是的!我确实认为这也是一个重用单元问题。
  • 我添加了这个 "if(NSUserDefaults().totalDabs >= 10000){ print("设置要解锁的瘦") self.characters[2].featuredImage = UIImage(named: "LeanSquadCollectionView “)!}”在“cellForItemAtIndexPath”函数中,它起作用了。但是只有在我移动 collectionView 时才更新
【解决方案2】:

当您需要“刷新”集合视图时,告诉它重新加载其数据,然后所有图像都应根据需要更新。

collectionView.reloadData()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多