假设我有一个相对复杂的故事板,其中有一个登录屏幕,可以访问包含几个嵌入式UINavigationControllers及其子节点的UITabBarController,如下所示:
LoginViewController是根VC,并通过检查存储的凭据或要求新的凭据来决定用户是否已登录。然后它将UITabBarController呈现为模态。
有四种情况:
1)如果用户从冷启动应用程序,他们应该看到ListViewController。
2)如果应用程序是通过关于" Foo"的推送通知从冷启动的,则应直接转到FooDetailViewController。
3)如果应用程序通过关于&#34; Foo&#34;的推送通知进行热启动,则应该直接转到FooDetailViewController,无论他们在应用程序背景时看到什么VC。< / p>
4)如果用户热启动应用程序,他们应该回到应用程序背景时他们正在查看的任何VC。
所有这些决策的逻辑在哪里?如果我将它放在AppDelegate中,我最终会尝试将视图控制器推送到我的层次结构之前(Warning: Attempt to present ViewControllerX on ViewControllerY whose view is not in the window hierarchy!
)。 UITabBarController的viewWillAppear:生命周期方法似乎没有在热启动时被调用,并且在每个子视图控制器中放置逻辑以检查它是否已从推送开始似乎耦合了不应该耦合的东西(实际上似乎导致导航堆栈损坏。)
其他人如何构建这个?
答案 0 :(得分:0)
您必须通过创建确定必须首先打开的视图控制器所需的属性来在UIApplicationDelegate
内创建该逻辑。
您拥有的第一个保证用户界面(窗口)已准备好的地方位于应用程序代表-applicationDidBecomeActive:
上,但是从这里开始有两个操作过程:
对于ListViewController
和OtherListViewController
很简单,您只需致电-setSelectedViewController
上的UITabBarController
;
对于FooDetail和BarDetail,我认为最好的方法是在ListViewController上放置一些逻辑,向它发送一个对想要显示细节的对象的引用,并在ListViewController上执行相关的segue&#39; s {{ 1}}。