我设计并构建了基于UINavigationController的游戏。我在图片上有几个ViewControllers。您可以从RootVC中选择NewGame,然后就可以玩了。完成后,您要求进入NextBoardVC的下一个板。在10个板之后,你将通过NextLevelVC进入下一个级别。有5个级别。每个级别包含10个板。问题是我正在使用pushViewController方法推送每个ViewController。在5个级别后,我在堆栈上有52个VC,有时应用程序崩溃。
GameVC包含许多png,有些听起来很重。我没有任何泄漏(由仪器测试)
抱歉,我没有声誉,所以我无法通过stackoverflow上传图片。
这是一张图片:
视图层次结构的文本表示:
RootVC
--OptionsVC
--HowToPlayVC
--NewGameVC
--GameVC
--NextBoardVC
--NextLevelVC
--GameVC
--NextBoardVC
--NextLevelVC
--GameVC
--NextBoardVC
--NextLevelVC
--GameVC
--... and so on many times
有没有更好的方法来进行导航,并消除崩溃?
答案 0 :(得分:2)
为什么不直接弹出控制器而不是仅仅推动越来越多的控制器,尤其是在你的“循环”中返回的那些点?
答案 1 :(得分:0)
不要忘记您可以使用setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
直接在导航堆栈上设置视图控制器。
因此,不是将新关卡推送到导航堆栈,而是通过创建一个包含所有视图控制器的数组加上新关卡,并使用上面的setViewControllers
方法,而不是将一个关卡替换为下一个关卡。
答案 2 :(得分:0)
您正在错误地管理视图控制器层次结构。导航控制器永远不应该有你的图表所示的循环。
此外,导航控制器应首先管理 可视 层次结构,并在一秒钟内进行逻辑管理。例如。联系人应用程序,其中组列表视图推送联系人列表,该联系人列表推送联系人详细信息,该详细信息推送多个属性详细信息编辑视图中的一个。每次离开一个视图时,都会弹出该视图,并将层次结构“返回”上一个视图。您永远不会将其配置从一个联系人详细信息视图转到下一个联系人视图,只需在最后一个合同详细信息视图顶部推送另一个联系人详细信息视图。
同样,您需要在推送下一个之前从堆栈中弹出现有的BoardVC
或LevelVC
。
(Key:here - >表示push和< - 表示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个视图控制器。