我有一个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,但没有任何反应。
答案 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()
}
}