我设计并构建了基于UINavigationController的游戏。我在照片上有几个类似的ViewControllers。您从NewGame中选择RootVC,就可以开始播放了。完成后,你要求去下一个董事会在NextBoardVC。经过10个董事会,你将进入下一个水平的NextLevelVC。有5个层次。每个级别有10个董事会。问题是,我正在使用ViewController方法推送每个pushViewController。在5级之后,我在堆栈上有52个VC,有时应用程序崩溃。
GameVC包含很多png,还有一些声音,所以它很重。我没有任何泄漏(由仪器测试)
对不起,我没有声誉,所以我不能上传图片堆叠溢出。
这是一张图片:

视图层次结构的文本表示:
RootVC
--OptionsVC
--HowToPlayVC
--NewGameVC
--GameVC
--NextBoardVC
--NextLevelVC
--GameVC
--NextBoardVC
--NextLevelVC
--GameVC
--NextBoardVC
--NextLevelVC
--GameVC
--... and so on many times有更好的方法来进行导航,并消除崩溃吗?
发布于 2011-07-06 15:34:28
为什么你不干脆把控制器放回去,而不是把越来越多的控制器推到上面,特别是在你返回“循环”的时候?
发布于 2011-07-06 15:36:11
不要忘记,您可以使用setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated直接在导航堆栈上设置视图控制器。
因此,与其将新级别推到导航堆栈上,您还可以通过创建一个数组来将一个级别替换为下一个级别,该数组包含所有视图控制器,再加上您的新级别,并使用上面的setViewControllers方法。
发布于 2011-07-06 19:29:19
您正在错误地管理视图控制器层次结构。导航控制器不应该像图所示的那样有一个循环。
此外,导航控制器应该首先管理可视层次结构,并管理逻辑一秒。例如,联系人应用程序,其中一个组列表视图推送了一个联系人列表,该列表推送了一个联系人详细信息,它推动了几个属性细节编辑视图中的一个。每次离开一个视图时,都会弹出该视图,并将层次结构“向上”返回到前一个视图。您永远不会将它从一个联系人详细信息视图配置到下一个联系人视图,只需将另一个联系人详细信息视图推到最后一个契约详细信息视图之上。
同样,在推送下一个堆栈之前,您需要从堆栈中弹出现有的BoardVC或LevelVC。
(键:此处->表示推,<--表示pop)
要设置新游戏的第一级,您可以:
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个视图控制器。
https://stackoverflow.com/questions/6598948
复制相似问题