我有一个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()
}
}
更新:
在dismissViewController之后,println()viewWillAppear和viewDidAppear将在控制台中打印,但不会重新加载collectonView数据 .
更新collectionView的数据库(完成在gameOver()之前调用的另一个函数) .
我尝试了下面建议的方法,它引用了UIViewController并从viewDidDisappear调用了reloadData,但没有任何反应 .
3 回答
检查以确保您的数据源正在更新(
viewDidAppear()
中的一些println将有所帮助) - 此外,尝试存储对collectionView控制器的引用并在gameViewController的viewWillDisappear()
方法中调用reloadData()
.有些日子我想踢自己的背后!
我'愚蠢地'忘了重新加载临时数组(levelProgress),该数组包含从collectionViewController中的数据库(在appDelegate中的数组中保存)获取的信息 .
因此,当appDelegate中的数据库和数组被更新时,reloadData()仍在使用collectionViewController中的tempArray . 在viewDidAppear()上重置此tempArray,然后reloadData()就可以了 .
我想我的代码是盲目的
实际上这就是
completion
论证的用途