Ios 如何从推送通知跳转到复杂故事板中的任意场景?
比如说,我有一个相对复杂的故事板,上面有一个登录屏幕,用来保护对包含两个嵌入式uinavigationcontroller及其子控制器的uitabarcontroller的访问,如下所示: LoginViewController是根VC,通过检查存储的凭据或请求新凭据来决定用户是否登录。然后将UITabBarController显示为模态 有四种情况: 1) 如果用户从冷启动应用程序,他们应该看到ListViewController 2) 如果应用程序是通过有关“Foo”的推送通知从冷启动的,则应直接转到foodailViewController 3) 如果应用程序是通过一个关于“Foo”的推送通知热启动的,那么无论应用程序背景是什么样的VC,他们都应该直接转到FooDetailViewController 4) 如果用户热启动应用程序,他们应该返回到应用程序后台时他们正在查看的任何VC 所有这些决策的逻辑在哪里?如果我将其放在AppDelegate中,我最终会尝试在视图控制器存在之前将其推送到我的层次结构上(Ios 如何从推送通知跳转到复杂故事板中的任意场景?,ios,uinavigationcontroller,push-notification,uistoryboard,Ios,Uinavigationcontroller,Push Notification,Uistoryboard,比如说,我有一个相对复杂的故事板,上面有一个登录屏幕,用来保护对包含两个嵌入式uinavigationcontroller及其子控制器的uitabarcontroller的访问,如下所示: LoginViewController是根VC,通过检查存储的凭据或请求新凭据来决定用户是否登录。然后将UITabBarController显示为模态 有四种情况: 1) 如果用户从冷启动应用程序,他们应该看到ListViewController 2) 如果应用程序是通过有关“Foo”的推送通知从冷启动的,
警告:尝试在视图不在窗口层次结构中的ViewControllerY上显示ViewControllerX!
)。UITabBarController的视图将出现:似乎没有在热启动时调用lifecycle方法,在每个子视图控制器中放入逻辑以检查它是否是从推送启动的,这似乎耦合了不应该耦合的东西(实际上似乎会导致导航堆栈损坏)
其他人是如何组织的?您必须在
uiapplicationelegate
中创建所需的属性,以确定必须首先打开的视图控制器是什么
确保用户界面(窗口)准备就绪的第一个位置是应用程序代理的-applicationIDBecomeActive:
,但从这里开始,有两个操作过程:
- 对于
和ListViewController
很容易,您只需在OtherListViewController
上调用UITabBarController
-setSelectedViewController
- 对于foodeail和BarDetail,我认为最好的方法是在ListViewController上放置一些逻辑,向它发送一个指向要显示细节的对象的引用,并在ListViewController的
上执行相关的segue-viewdide:
-applicationIDBecomeActive:
,因为无论应用程序来自非活动状态还是后台状态,都会调用它。但所有这些的逻辑都将在几个地方,比如-application:didReceiveMemotentification:fetchCompletionHandler:
,以涵盖推送通知的情况。在案例3中,您可以重新创建情节提要,这样您就可以更好地控制流程。在案例4中,使用状态恢复。