Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从推送通知跳转到复杂故事板中的任意场景?_Ios_Uinavigationcontroller_Push Notification_Uistoryboard - Fatal编程技术网

Ios 如何从推送通知跳转到复杂故事板中的任意场景?

Ios 如何从推送通知跳转到复杂故事板中的任意场景?,ios,uinavigationcontroller,push-notification,uistoryboard,Ios,Uinavigationcontroller,Push Notification,Uistoryboard,比如说,我有一个相对复杂的故事板,上面有一个登录屏幕,用来保护对包含两个嵌入式uinavigationcontroller及其子控制器的uitabarcontroller的访问,如下所示: LoginViewController是根VC,通过检查存储的凭据或请求新凭据来决定用户是否登录。然后将UITabBarController显示为模态 有四种情况: 1) 如果用户从冷启动应用程序,他们应该看到ListViewController 2) 如果应用程序是通过有关“Foo”的推送通知从冷启动的,

比如说,我有一个相对复杂的故事板,上面有一个登录屏幕,用来保护对包含两个嵌入式uinavigationcontroller及其子控制器的uitabarcontroller的访问,如下所示:

LoginViewController是根VC,通过检查存储的凭据或请求新凭据来决定用户是否登录。然后将UITabBarController显示为模态

有四种情况:

1) 如果用户从冷启动应用程序,他们应该看到ListViewController

2) 如果应用程序是通过有关“Foo”的推送通知从冷启动的,则应直接转到foodailViewController

3) 如果应用程序是通过一个关于“Foo”的推送通知热启动的,那么无论应用程序背景是什么样的VC,他们都应该直接转到FooDetailViewController

4) 如果用户热启动应用程序,他们应该返回到应用程序后台时他们正在查看的任何VC

所有这些决策的逻辑在哪里?如果我将其放在AppDelegate中,我最终会尝试在视图控制器存在之前将其推送到我的层次结构上(
警告:尝试在视图不在窗口层次结构中的ViewControllerY上显示ViewControllerX!
)。UITabBarController的视图将出现:似乎没有在热启动时调用lifecycle方法,在每个子视图控制器中放入逻辑以检查它是否是从推送启动的,这似乎耦合了不应该耦合的东西(实际上似乎会导致导航堆栈损坏)


其他人是如何组织的?

您必须在
uiapplicationelegate
中创建所需的属性,以确定必须首先打开的视图控制器是什么

确保用户界面(窗口)准备就绪的第一个位置是应用程序代理的
-applicationIDBecomeActive:
,但从这里开始,有两个操作过程:

  • 对于
    ListViewController
    OtherListViewController
    很容易,您只需在
    UITabBarController
    上调用
    -setSelectedViewController

  • 对于foodeail和BarDetail,我认为最好的方法是在ListViewController上放置一些逻辑,向它发送一个指向要显示细节的对象的引用,并在ListViewController的
    -viewdide:
    上执行相关的segue


但这不会实例化正确的导航层次结构。哦,我明白了,我不明白他需要相同的层次结构。我将编辑我的答案。是的,有很多微妙之处。这是一个很好的提示,窗口在ApplicationIDBecomeActive中已经准备好了,但是什么时候相对于application:DidReceiveMemotentification:调用该窗口呢?这实际上只包括案例1和案例2;如果用户从OtherListViewController设置应用背景,我必须在其中设置逻辑,以检查我是否从推送中醒来,然后在选项卡栏上设置SelectedViewController,然后传递到调用FooDetailVC的正确segue的逻辑。如果在ViewWillDisplay或ViewDidDisplay中发生这种情况,我建议
-applicationIDBecomeActive:
,因为无论应用程序来自非活动状态还是后台状态,都会调用它。但所有这些的逻辑都将在几个地方,比如
-application:didReceiveMemotentification:fetchCompletionHandler:
,以涵盖推送通知的情况。在案例3中,您可以重新创建情节提要,这样您就可以更好地控制流程。在案例4中,使用状态恢复。