【问题标题】:UIViewController load and release strategyUIViewController 加载和释放策略
【发布时间】:2015-05-08 10:50:23
【问题描述】:

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


(来源:noelshack.com

下面的代码说明了从一个屏幕转到另一个屏幕的逻辑(这里是从启动屏幕转到首选项设置屏幕或关卡选择屏幕)

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
            }
        }
    }
}

我使用与上述相同的逻辑从关卡选择屏幕转到播放关卡屏幕。

我遇到的问题是:

  • 当我从关卡选择屏幕转到播放关卡屏幕时,我 在过渡期间查看下面的启动屏幕
  • 当我退出 Play Level 屏幕时,我直接回到 Startup 屏幕而不是我来自的关卡选择屏幕
  • 我第二次从关卡选择屏幕进入游戏关卡 屏幕,我找回了上次的所有精灵。 SK场景 当我关闭播放级别屏幕时,不会删除 UIViewController。

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

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

我已经阅读了很多关于解除 UIViewController 的方法的资料,并且我明白推荐的方法是从调用 ViewController 中执行此操作(在我的情况下,这意味着我应该从关卡中解除播放关卡屏幕选择屏幕)。但是,我找不到这种方式的 Swift 示例(很多我无法理解的 Obj-C 示例)。

我想尽可能少地使用故事板并以编程方式完成大部分任务。今天我只是使用情节提要来创建每个 ViewController 并加载它,因为我还没有找到一种方法来编写所有代码。

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

【问题讨论】:

    标签: ios swift uiviewcontroller sprite-kit


    【解决方案1】:

    当我从关卡选择屏幕转到播放关卡屏幕时,我在转换过程中看到下面的启动屏幕

    在我看来,您推送的 UIViewController 具有清晰的背景,在这种情况下,您仍然可以看到底层 VC。

    当我退出播放关卡屏幕时,我会直接返回启动屏幕,而不是我原来的关卡选择屏幕

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

    我第二次从关卡选择屏幕转到播放关卡屏幕时,我找到了上一次的所有精灵。当我关闭 UIViewController 时,Play Level Screen 的 SKScene 没有被删除。

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

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

    【讨论】:

    • 我没有使用与导航控制器相关的 pop/push 方法,据我所知,这似乎不是正确的选择。
    猜你喜欢
    • 2013-02-16
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2017-04-09
    • 2016-12-09
    • 2011-06-30
    相关资源
    最近更新 更多