如何让 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"];
我有一个 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"];