0

我设计和构建了基于 UINavigationController 的游戏。我有几个像图片上的 ViewController。您从 RootVC 中选择 NewGame,您就可以开始游戏了。完成后,您要求进入 NextBoardVC 中的下一个板。在 10 块板之后,您将通过 NextLevelVC 进入下一个级别。有5个级别。每个级别包含 10 个板。问题是我正在使用 pushViewController 方法推送每个 ViewController。在 5 个级别之后,我在堆栈上有 52 个 VC,有时应用程序会崩溃。

GameVC 包含许多 png,还有一些声音,所以它很重。我没有任何泄漏(由 Instruments 测试)

抱歉,我没有声誉,所以我无法通过 stackoverflow 上传图片。

这是一张图片: http://imageshack.us/photo/my-images/641/navigationg.jpg/

视图层次结构的文本表示:

RootVC 
--OptionsVC
--HowToPlayVC
--NewGameVC
  --GameVC
    --NextBoardVC
      --NextLevelVC
        --GameVC
          --NextBoardVC
              --NextLevelVC
                --GameVC
                  --NextBoardVC
                    --NextLevelVC
                      --GameVC
                        --... and so on many times

有没有更好的方法来进行导航并消除崩溃?

4

3 回答 3

2

为什么不直接将控制器弹出,而不是将越来越多的控制器推到顶部,尤其是在“循环”中返回的那些点?

于 2011-07-06T15:34:28.060 回答
0

Don't forget that you can directly set view controllers on a navigation stack, using setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated.

So rather than pushing new levels onto the navigation stack you could replace one level with the next one by creating an array containing all your view controller up to that point plus your new level, and using the setViewControllers method above.

于 2011-07-06T15:36:11.633 回答
0

您正在错误地管理视图控制器层次结构。导航控制器不应该像您的图表所建议的那样有一个循环。

此外,导航控制器应该首先管理视觉层次结构,然后再管理逻辑。例如联系人应用程序,其中组列表视图推送联系人列表,该联系人列表推送联系人详细信息,该联系人详细信息推送多个属性详细信息编辑视图之一。每次离开一个视图时,您都会弹出该视图并将层次结构“向上”返回到前一个视图。您永远不会通过在最后一个合同详细信息视图之上推动另一个联系人详细信息视图来配置它从一个联系人详细信息视图到下一个联系人视图。

同样,您需要在推送下一个之前将现有的BoardVCLevelVC从堆栈中弹出。

(键:这里 --> 表示推送,<-- 表示弹出)

要设置新游戏的第一关,您需要:

RootVC-->NewGameVC-->GameVC-->BoardVC-->LevelOneVC

...然后要添加下一个级别,您首先要:

RootVC-->NewGameVC-->GameVC-->BoardVC<--LevelOneVC

... 要得到:

RootVC-->NewGameVC-->GameVC-->BoardVC

... 接着:

RootVC-->NewGameVC-->GameVC-->BoardVC-->LevelTwoVC

...重复所有其他级别。您可以BoardVC根据需要对每个执行相同的操作。

这里的技巧是不使用默认导航控制器转换的幻灯片转换。该转换告诉用户期望这种逻辑布局:

RootVC-->NewGameVC-->GameVC-->BoardVC-->LevelOneVC-->LevelTwoVC

...这就是导致您的问题的原因。相反,使用另一个过渡,如淡入淡出或一起隐藏过渡。

通过弹出用户导航不需要的任何视图,您可以确保您的视图控制器堆栈在任何时候都不会超过 5 个视图控制器,因此内存中只需要 5 个视图控制器。

于 2011-07-06T19:29:19.253 回答