在dismissViewController之后调用reloadData()

时间:2015-07-07 23:38:06

标签: swift

我有一个collectionView控制器,其中包含一个由数据库填充的collectionView。在这个控制器中,我在'viewDidAppear'和'viewWillAppear'函数中有reloadData()。

collectionView控制器具有gameViewController的模态segue。在gameViewController中完成'游戏'后,数据库会更新(这个工作)并且模态被解除回到collectionView控制器。

func gameOver() {
    self.dismissViewControllerAnimated(true, completion: nil)
}

然而,尽管调用了'viewDidAppear'和'viewWillAppear'(我用println()确认了这一点)当gameViewController被解除时,collectionView数据不会重新加载。因此更新的数据库数据不会显示在collectionView中。

如果我关闭collectionView控制器,然后重新打开它,则会重新加载collectionView数据。

如何确保在解除gameViewController后调用collectionView控制器 - reloadData()?

代码:

class GameViewController: UIViewController {

var collectionView: LevelsCollectionViewController!

override func viewDidLoad() {
    super.viewDidLoad()

    // code not related to question - creates game scene 
}

override func viewDidDisappear(animated: Bool) {
    collectionView.reloadData()
}

func gameOver() {
    self.dismissViewControllerAnimated(true, completion: nil)
}



class LevelsCollectionViewController: UICollectionViewController {

// code setting up cells

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    println("viewWillAppear")

    self.collectionView!.reloadData()
    self.collectionView!.setNeedsDisplay()
    }

override func viewDidAppear(animated: Bool) {
    super.viewWillAppear(animated)
    println("viewDidAppear")
            self.collectionView!.reloadData()
    self.collectionView!.setNeedsDisplay()
}
}

更新:

println()viewWillAppear& viewDidAppear在dismissViewController之后打印在控制台中,但不重新加载collectonView数据。

更新collectionView的数据库(完成是在gameOver()之前调用的另一个函数。

我尝试了下面建议的方法,它引用了UIViewController并从viewDidDisappear调用了reloadData,但没有任何反应。

3 个答案:

答案 0 :(得分:0)

检查以确保您的数据源正在更新(viewDidAppear()中的一些打印件将有所帮助) - 此外,尝试存储对collectionView控制器的引用并调用{{1}在你的gameViewController的reloadData()方法中。

答案 1 :(得分:0)

有些日子我想踢自己的背后!

我愚蠢地'忘了重新加载临时数组(levelProgress),该数组包含从collectionViewController中的数据库(在appDelegate中的数组中保存)中获取的信息。

因此,当正在更新appDelegate中的数据库和数组时,reloadData()仍在处理collectionViewController中的tempArray。在viewDidAppear()上重置此tempArray,然后reloadData()就可以了。

override func viewDidAppear(animated: Bool) {
    super.viewWillAppear(animated)
    levelProgress = appDelegate.levelProgress
    self.collectionView!.reloadData()
    self.collectionView!.setNeedsDisplay()
}

想想我的代码是盲目的

答案 2 :(得分:0)

实际上这就是completion参数的含义

func gameOver() {
    self.dismissViewControllerAnimated(true) { () -> Void in
       self.collectionView.reloadData()
    }
}