当 rootViewController 不是 UINavigationController 时推送视图

Posted

技术标签:

【中文标题】当 rootViewController 不是 UINavigationController 时推送视图【英文标题】:Pushing a view when the rootViewController is not a UINavigationController 【发布时间】:2013-04-18 18:06:41 【问题描述】:

好的,所以我一直在寻找以下问题的答案:当来自 AppDelegate 的推送通知到达时,如何将某个视图控制器推送到视图中?

大多数答案是,如果 rootViewController 是 UINavigationController,我必须通过我的 StoryBoard 实例化一个视图并使用该根导航控制器推送它。

这是我的情况。这是我的故事板的组织方式:

如您所见,我的 rootViewController 没有 UINavigationController。那么,我该如何将某个视图从我的故事板中推出呢?

注意:为推送通知提供一些单独的模式视图并不是一个好主意。这是我最后的手段。

我想要 Apple Mail 和 Message 应用程序中的解决方案。

【问题讨论】:

你可以添加嵌入你的rootViewController到navigationController并保持navigationBar隐藏? 这是一个开始,但是我如何从 StoryBoard 推送另一个视图?还是只能创建和展示新的? 您想从哪个控制器显示(推送)这个新的视图控制器(是否希望能够在通知到来时从屏幕上的任何控制器推送它)?这个新控制器的目的是什么?根据它的用途,模态演示可能更合适。 @rdelmar 是的,我想将现有的视图控制器(来自我的故事板)推送到当时显示的任何控制器上。我的意思是这对我来说是完美的解决方案。那可能吗?正如我所说,以模态方式显示视图是我最后的手段 @SergeyCatraniuc,为什么将它作为最后的手段提出来?如果您希望能够从任何控制器呈现它,我不确定您是否有任何选择。由于来自推送通知的信息会中断应用程序逻辑流程,因此模态演示似乎最合适——这就是它们的用途。 【参考方案1】:

好吧,我想我不会那么轻易放弃 :) 这是我找到的解决问题的方法。由于我是在模态视图控制器中展示我的主要应用程序视图,所以我做了以下操作:

ios 5 开始,每个视图控制器都有一个 presentedViewController 属性。一旦你知道了,从那里开始就很容易了。 这是 AppDelegate.m 中的一些特定代码

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo   
   if ([[userInfo objectForKey:@"notificationType"] isEqualToString: @"messageType"])   

   UITabBarController * tabBarController = (UITabBarController *)[self.window.rootViewController presentedViewController];
[tabBarController setSelectedIndex:kChatViewIndex]; 
// My view controller that I presented modally is a tabBar, your case can be different. 

// ... so from here I can reach any navigation controller or any other view from inside my app


现在既然你已经有了你的视图控制器,你可以使用 setSelectedIndex: 如果它是一个 tabBarController,或者如果它是一个导航单元,则推送某个视图控制器。

希望这对遇到类似问题的人有所帮助。 干杯!

【讨论】:

以上是关于当 rootViewController 不是 UINavigationController 时推送视图的主要内容,如果未能解决你的问题,请参考以下文章

在代码中使用导航控制器而不是 rootviewcontroller

window.rootViewController 怎么可能不是 initialViewController?

当应用程序 rootViewController 是 tabBarController 时 UINavigationController 的奇怪行为

使用不是 rootViewController 的 TabBarViewController 更改 UITabBar 的图标

当 UINavigationController 通过 Storyboard 模态呈现时,它的 rootViewController 与它没有连接

Swift - 当应用程序进入后台状态时,从 AppDelegate 更新 RootViewController 中的值