如何让 App delegate 在 PushNotification 后显示特定的 UIViewController

How to get App delegate to display a specific UIViewController after PushNotification

我有一个 TabBarController 作为 App 入口点。在收到 Local-Notification 后,我想显示一个特定的 UIViewController.

取决于实际的应用程序状态(最前面/最前面,不是 运行),我能够通过例如application:willFinishLaunchingWithOptions:application:didReceiveLocalNotification: 在 appdelegate 中。

但是,当时我无法管理打开特定的 UIViewController(顺便说一句,它不是 tabbarcontroller.selectedIndexes 之一)。

我尝试了各种方法,例如presentViewController:

Today*today = [[Today alloc] init];
[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:today animated:NO completion:nil];

离开错误:

Warning: Attempt to present <Today: 0x7fcb91ed5a40> on <UITabBarController: 0x7fcb91c79810> whose view is not in the window hierarchy!

此处的帖子表明在调用 presentViewController 之前使用 [self.window makeKeyAndVisible];: 同样的错误!

其他帖子 [thisOne] 表明可以通过将 presentViewController 放在 viewDidAppear: 中来省略此错误,但是,这在 appdelegate 中是不可能的,我在其中捕获了本地通知...

即使调用 segue 也是不可能的,因为此时似乎还没有加载视图控制器...

有些人表示根本不可能从 AppDelegate 调用 UIViewController,对吗?

我没主意了,你有什么办法吗....?!?

我找到了适合我的解决方案:

确保您的 UIViewController(今天在这里)嵌入到 NavigationController 中。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

Today* today=[[UIStoryboard storyboardWithName:@"Main" bundle:nil]  instantiateViewControllerWithIdentifier:@"Today"];

UINavigationController *navigationController=[[UINavigationController alloc] initWithRootViewController:today];
self.window.rootViewController =nil;
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

}

希望这对您有所帮助...

如果您想获得任何其他 UIViewController,而不仅仅是 rootViewController:

UIWindow *window=[UIApplication sharedApplication].keyWindow;
UIViewController *root = [window rootViewController];

UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];