目前ViewController与场景

时间:2016-10-20 07:47:28

标签: ios swift sprite-kit

我有一个带按钮开始游戏的游戏菜单:

@IBAction func startGame(_ sender: AnyObject) {
        if let vc = self.storyboard?.instantiateViewController(withIdentifier: "gameViewController") as? GameViewController {
            vc.modalTransitionStyle = .crossDissolve
            self.present(vc, animated: true, completion: nil)
        }
    }

游戏代码:

if lifes == 0 {
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainMenuViewController") as? MainMenuViewController {
        vc.modalTransitionStyle = .crossDissolve
        self.present(vc, animated: true, completion: nil)
    }
}

当用户点击按钮时,我会使用Sprite Kit场景显示新的视图控制器。但是当游戏结束时,我会回到菜单。如果我们再次点击开始游戏,fps会从60(在我的情况下)下降到30,然后再到20等等。好像旧视图控制器仍在工作。如何解雇?

我读过类似的问题,但没有找到答案。

1 个答案:

答案 0 :(得分:1)

好的,现在你的问题很清楚了。

游戏结束时,您不应该展示新的MainViewController。这将导致您可能无限堆栈的视图控制器,如下所示: 主要 - >游戏 - >主要 - >游戏 - > ... 相反,你应该解雇你的游戏vc并返回到前一个控制器,这样你内存中总会有一个或两个控制器。

所以你应该替换它:

if lifes == 0 {
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainMenuViewController") as? MainMenuViewController {
        vc.modalTransitionStyle = .crossDissolve
        self.present(vc, animated: true, completion: nil)
    }
}

有了这个:

if lifes == 0 {
    dismiss(animated: true, completion: nil) //will bring you to previous Main vc
}

修改

如果要显示两个以上的控制器,则应考虑导航控制器方法。基本上你用rootViewController(MainVC)创建它,然后推送GameVC,然后推送GameOver。

在MainVC中:

self.navigationController?.pushViewController(gameVC, animated: true)

在GameVC中:

self.navigationController?.pushViewController(gameOverVC, animated: true)

仅弹出一个控制器:

self.navigationController?.popViewController(animated: true)

弹出到第一个控制器:

self.navigationController?.popToRootViewController(animated: true)