Ios 从推送通知启动时启动viewController中的所有对象
我有一个viewController X(不是初始视图)。X是多个父级的childViewController(多个viewController将X作为其子级)。在X上,有一个标签、表格和一个导航栏,带有一个左栏按钮,可“弹出”回其父级。当应用程序正常启动时,所有segues、popToParentViewController和back按钮都能正常工作。但是,如果我要从推送通知启动应用程序,则X仅显示导航栏和按钮(但不起作用)以及表视图 我不知道为什么标签没有显示出来!“后退”按钮不会返回“后退”。我知道这与“无父项”有关,因为我在下面的代码中将它设置为“根” 如何用代码正确地实现我想要的东西 下面是appDelegate.m中的Ios 从推送通知启动时启动viewController中的所有对象,ios,objective-c,uinavigationcontroller,uistoryboard,appdelegate,Ios,Objective C,Uinavigationcontroller,Uistoryboard,Appdelegate,我有一个viewController X(不是初始视图)。X是多个父级的childViewController(多个viewController将X作为其子级)。在X上,有一个标签、表格和一个导航栏,带有一个左栏按钮,可“弹出”回其父级。当应用程序正常启动时,所有segues、popToParentViewController和back按钮都能正常工作。但是,如果我要从推送通知启动应用程序,则X仅显示导航栏和按钮(但不起作用)以及表视图 我不知道为什么标签没有显示出来!“后退”按钮不会返回“后退
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground )
{
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
NotificationsViewController *viewController= [mainStoryboard instantiateViewControllerWithIdentifier:@"NotificationsViewController"];
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:viewController];
[_window setRootViewController:nav];
}
}
您需要确保在根视图控制器和目标视图控制器之间创建所有视图控制器,并将它们推送到堆栈上,可以通过一次调用
[nav setViewControllers:animated:
或多次调用[nav pushViewController:animated:]
在任何一种情况下,您都可能需要确保动画参数为false
我认为您还需要确保在收到通知时,您还没有到不方便的地方,因为执行所有旋转操作可能会让用户感到非常困惑。您需要确保在根视图控制器和目标视图控制器之间创建所有视图控制器,并将它们推到堆栈上,通过一次调用
[nav setViewControllers:animated:
或多次调用[nav pushViewController:animated:
,您可能需要确保动画参数为false
我认为您还需要确保在收到通知时,您还没有到不方便的地方,因为执行所有旋转操作可能会让用户感到非常困惑。您需要确保在根视图控制器和目标视图控制器之间创建所有视图控制器,并将它们推到堆栈上,通过一次调用
[nav setViewControllers:animated:
或多次调用[nav pushViewController:animated:
,您可能需要确保动画参数为false
我认为您还需要确保在收到通知时,您还没有到不方便的地方,因为执行所有旋转操作可能会让用户感到非常困惑。您需要确保在根视图控制器和目标视图控制器之间创建所有视图控制器,并将它们推到堆栈上,通过一次调用
[nav setViewControllers:animated:
或多次调用[nav pushViewController:animated:
,您可能需要确保动画参数为false
我认为您还需要确保,在收到通知时,您不会已经到了不方便的地方,因为执行所有旋转操作可能会让用户感到非常困惑。首先,应用程序总是使用
-(BOOL)应用程序:(UIApplication*)应用程序完成启动时使用的选项:(NSDictionary*)launchOptions
方法。您应检查launchOptions字典,以检查应用程序是否因通知而打开。在该启动方法中,您可以通过以下方式访问通知对象:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
{
// setup navigation controller here, I assume you already have this in your code
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"%@: did launch with notification: %@", [self class], dictionary);
// put the navigation controllers on the nav controller stack as David described
}
[[self window] setRootViewController:navigationController];
[self.window makeKeyAndVisible];
return YES;
}
方法
-(void)application:(UIApplication*)application didReceivereMotentification:(NSDictionary*)仅当应用程序已启动时,才会调用userInfo
。当应用程序从后台切换到前台或运行时,可以调用userInfo。当应用程序作为新进程启动时,永远不会调用此方法。首先,应用程序始终使用-(BOOL)应用程序:(UIApplication*)启动应用程序didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
方法。您应检查launchOptions字典,以检查应用程序是否因通知而打开。在该启动方法中,您可以通过以下方式访问通知对象:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
{
// setup navigation controller here, I assume you already have this in your code
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"%@: did launch with notification: %@", [self class], dictionary);
// put the navigation controllers on the nav controller stack as David described
}
[[self window] setRootViewController:navigationController];
[self.window makeKeyAndVisible];
return YES;
}
方法
-(void)application:(UIApplication*)application didReceivereMotentification:(NSDictionary*)仅当应用程序已启动时,才会调用userInfo
。当应用程序从后台切换到前台或运行时,可以调用userInfo。当应用程序作为新进程启动时,永远不会调用此方法。首先,应用程序始终使用-(BOOL)应用程序:(UIApplication*)启动应用程序didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
方法。您应检查launchOptions字典,以检查应用程序是否因通知而打开。在该启动方法中,您可以通过以下方式访问通知对象:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
{
// setup navigation controller here, I assume you already have this in your code
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"%@: did launch with notification: %@", [self class], dictionary);
// put the navigation controllers on the nav controller stack as David described
}
[[self window] setRootViewController:navigationController];
[self.window makeKeyAndVisible];
return YES;
}
方法
-(void)application:(UIApplication*)application didReceivereMotentification:(NSDictionary*)仅当应用程序已启动时,才会调用userInfo
。当应用程序从后台切换到前台或运行时,可以调用userInfo。当应用程序作为新进程启动时,永远不会调用此方法。首先,应用程序始终使用-(BOOL)应用程序:(UIApplication*)启动应用程序didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
方法。您应检查launchOptions字典,以检查应用程序是否因通知而打开。在该启动方法中,您可以通过以下方式访问通知对象:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
{
// setup navigation controller here, I assume you already have this in your code
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"%@: did launch with notification: %@", [self class], dictionary);
// put the navigation controllers on the nav controller stack as David described
}
[[self window] setRootViewController:navigationController];
[self.window makeKeyAndVisible];
return YES;
}
仅当应用程序已启动时,才会调用方法-(void)application:(UIApplication*)application didReceiveMemotentification:(NSDictionary*)userInfo
。可以在应用程序从后台切换到前台时调用,也可以在应用程序重新启动时调用