UINavigationController的替代品

我正在开发一个应用程序,类似于“select你自己的冒险”的书的结构,有很多的多媒体内容(主要是照片和video)。 每个“页面”是一个ViewController ,用户必须在其中完成一个谜题或其他任务才能进入下一个任务。

我正在创build一个UINavigationController ,并将每个新的ViewController放在堆栈的顶部。 但是我担心有内存问题,因为有一些沉重的多媒体内容,我不popup任何ViewController ,90%的时间,用户不能回到以前的ViewController ,只是转发到一个新的。

我想要一个替代scheme,每当我跳到一个新的ViewController ,旧的从内存中释放。

如果你不打算回去,那么你应该摆脱你的旧的UIViewController实例。 你可以在UIViewController的新实例被推送到UINavigationController栈之后这样做。

其中一种方法是将视图控制器的viewDidAppearviewDidLayoutSubviews方法中的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:方法适当地设置视图控制器堆栈。

https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html