UIViewController加载和释放策略

时间:2015-03-06 18:40:01

标签: ios swift uiviewcontroller sprite-kit

我正在根据下面描述的导航逻辑用SpriteKit和Swift构建游戏。

下面的代码说明了从一个屏幕到另一个屏幕的逻辑(此处从启动屏幕转到首选项设置屏幕或级别选择屏幕)

class StartupScreen: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        let StartView = self.view as SKView
        let StartScene = StartSceneClass(size: self.view.bounds.size)
        StartView.ignoresSiblingOrder = true
        StartScene.scaleMode = .AspectFill

        StartView.presentScene(StartScene)
    }

+ some other code

}

class StartSceneClass: SKScene
{

+ some init and game logic code…

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
    {
        for touch: AnyObject in touches
        {
            let location = touch.locationInNode(self)

            switch self.nodeAtPoint(location)
            {
            case self.playButton:                
                let vc = self.view?.window?.rootViewController?.storyboard!.instantiateViewControllerWithIdentifier("ChoixLevelVC") as ChoixLevelVC
                self.view?.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil)

            case self.BoutonPrefs:
                let vc = self.view?.window?.rootViewController?.storyboard!.instantiateViewControllerWithIdentifier("PlayLevelVC") as PlayLevelVC
                self.view?.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil)

            default:
                break
            }
        }
    }
}

我使用与上面相同的逻辑从Level Level屏幕进入Play Level屏幕。

我遇到的问题是:

  • 当我从等级选择屏幕进入游戏等级屏幕时,我 请参阅下面的过渡期间的启动屏幕
  • 当我退出Play Level屏幕时,我会直接回到Startup 屏幕而不是我来自的级别选择屏幕
  • 第二次从Level Choice屏幕进入Play Level 屏幕,我找回了前一次的所有精灵。 SKScene 当我解雇时,不会删除播放等级屏幕 的UIViewController。

关于最后一个问题,我想要的是每次退出时都完全杀死/擦除Play Level屏幕。

到目前为止,我已经在SKScene或被调用的UIViewController的UIViewController中实现了self.view?.window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)来解除视图控制器。

我已经阅读了许多有关解散UIViewController的方法的内容,我已经明白推荐的方法是从调用ViewController进行操作(在我的情况下,这意味着我应该从Level中解除Play Level屏幕选择屏幕)。但是,我找不到这种方式的Swift示例(很多Obj-C示例,我无法理解)。

我想尽可能少地使用故事板并以编程方式完成大部分任务。今天我只是使用故事板来创建每个ViewController并加载它,因为我找不到编写所有内容的方法。

感谢有关正确实施此类导航逻辑的最佳方式的任何链接或建议。

1 个答案:

答案 0 :(得分:0)

当我从等级选择屏幕进入游戏等级屏幕时,我会在转换过程中看到下面的启动屏幕

这听起来像你正在推动的UIViewController具有明确的背景,在这种情况下,你仍然可以看到底层的VC。

当我退出Play Level屏幕时,我会直接返回启动屏幕而不是我来自的Level Choice屏幕

您使用的是popViewController还是popToRootViewController?当使用popViewController时,它应该按预期工作。

第二次从Level Level屏幕进入Play Level屏幕,我找回了前一次的所有精灵。当我关闭UIViewController时,不会删除Play Level屏幕的SKScene。

如果我错了,请纠正我,但是在我理解你弹出UIViewController时,它会在堆/内存中停留一段时间,直到另一个UIViewController被推送到UINavigationController。

你可以尝试在viewWillDisappear中清空你的精灵吗?