首页 文章

在dismissViewController之后调用reloadData()

提问于
浏览
0

我有一个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 回答

  • 0

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

  • 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()
    }
    

    我想我的代码是盲目的

  • 0

    实际上这就是 completion 论证的用途

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

相关问题