【问题标题】:Initiating all objects in viewController when launched from a push notification从推送通知启动时启动 viewController 中的所有对象
【发布时间】:2014-05-02 11:56:39
【问题描述】:

我有一个 viewController X(不是初始视图)。 X 是几个父母的 childViewController(几个 viewController 将 X 作为他们的孩子。)在 X 上,有一个标签、表格和一个导航栏,带有一个“弹出”回其父级的左栏按钮。当应用程序正常启动时,所有 segues、popToParentViewController、后退按钮都正常工作。但是,如果我要从推送通知启动应用程序,则 X 仅显示导航栏和按钮(但不起作用)和表格视图。

我不知道为什么标签没有显示!并且后退按钮不会“返回”。我知道这与“无父”有关,因为我在 下面的代码中将其设置为“根”。

如何使用代码正确实现我想要的?

以下在appDelegate.m中

- (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];
}
}

【问题讨论】:

    标签: ios objective-c uinavigationcontroller uistoryboard appdelegate


    【解决方案1】:

    您需要确保在根视图控制器和目标视图控制器之间创建所有视图控制器并将它们推送到堆栈上,无论是通过一次调用 [nav setViewControllers:animated:] 还是多次调用 [nav pushViewController:animated:] 在任何一种情况下您可能需要确保动画参数为 false。

    我认为您还需要确保在收到通知时您还没有感到不便,因为所有的旋转都可能会让用户感到非常困惑。

    【讨论】:

    • 多个 pushViewController:animated: 调用是有风险的,因为当您在另一个动画推/拉操作期间拉或推某物时,UINavigationController 会出现令人讨厌的故障。最好使用 setViewControllers:animated:
    • 如何在 appDelegate 中做到这一点? @MaksymilianWojakowski 我不认为 self.window setViewControllers:animated 作品
    【解决方案2】:

    首先,应用程序总是使用- (BOOL)application:(UIApplication *)application 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 didReceiveRemoteNotification:(NSDictionary *)userInfo 将被调用。它可以在应用程序从后台切换到前台或运行时调用。当应用程序作为新进程启动时,永远不会调用此方法。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      相关资源
      最近更新 更多