UINavigationController的替代品
我正在开发一个应用程序,类似于“select你自己的冒险”的书的结构,有很多的多媒体内容(主要是照片和video)。 每个“页面”是一个ViewController
,用户必须在其中完成一个谜题或其他任务才能进入下一个任务。
我正在创build一个UINavigationController
,并将每个新的ViewController
放在堆栈的顶部。 但是我担心有内存问题,因为有一些沉重的多媒体内容,我不popup任何ViewController
,90%的时间,用户不能回到以前的ViewController
,只是转发到一个新的。
我想要一个替代scheme,每当我跳到一个新的ViewController
,旧的从内存中释放。
如果你不打算回去,那么你应该摆脱你的旧的UIViewController
实例。 你可以在UIViewController
的新实例被推送到UINavigationController栈之后这样做。
其中一种方法是将视图控制器的viewDidAppear
或viewDidLayoutSubviews
方法中的navigationController.viewControllers
数组replace为navigationController.viewControllers
控制器。 意思是,你将在每个UIViewController
实例中需要它。
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; navigationController.viewControllers = @[viewController]; }
如果您使用处理推送新UIViewController
实例的主容器控制器,则第二个选项非常有用。 只需实现UINavigationControllerDelegate
协议并实现navigationController:didShowViewController:animated:
方法,如下所示。
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { navigationController.viewControllers = @[viewController]; }
在新的实例被推送后,它应该重置你的navigationController
的控制器堆栈。
很明显,你可以修改这个逻辑,不要删除那些你想返回的东西。
UINavigationController类允许您读取和写入视图控制器的数组,使用它来实现它的堆栈,但是你喜欢。 你并不仅限于推送和popup视图控制器。
在你的情况下,每次用户移动到应用程序的下一页,你应该评估你是否需要保持最后一个周围。 如果你这样做,你可以把它推入堆栈,但是,如果你不这样做,你应该把它从数组中取出,然后使用setViewControllers:animated:方法适当地设置视图控制器堆栈。