在ios上从AppDelegate更改UIViewController以进行推送通知

时间:2013-12-13 00:02:14

标签: ios iphone objective-c uiviewcontroller

当用户获得推送通知时,我希望应用程序打开某个UIViewController。我在带有故事板的xCode 5中。

我认为我的代码很接近,但却抛出错误

以下是AppDelegate中的方法

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    RewardList *vc = (RewardList *)[storyboard instantiateViewControllerWithIdentifier:@"RewardList"];
    [nav pushViewController:vc animated:YES];
}

[nav pushViewController:vc animated:YES];出错了我不太清楚发生了什么。有人可以帮助阐明这个问题吗?

这是错误:

-[SplashViewController pushViewController:animated:]: unrecognized selector sent to instance 0x1f862630 2013-12-12 17:58:28.719 appName[473:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SplashViewController pushViewController:animated:]: unrecognized selector sent to instance 0x1f862630'

编辑: 应用程序根视图控制器是SplashNavigationController,它是一个UIViewController。从那里我有一个UITabBarController。在我的第三个标签上的内部是RewardList,它也是一个UIViewController。我需要从当前视图转到我的第三个选项卡,RewardList选项卡。

我在这方面发现了很多帖子,但在我的案例中似乎没有任何作用。

3 个答案:

答案 0 :(得分:0)

听起来你的根视图控制器是SplashViewController类的视图控制器。 SplashViewController是UINavigationController的子类吗?它必须是,否则你会得到那个错误。

答案 1 :(得分:0)

我要做的第一件事就是更改结构,以便标签栏控制器是窗口的根视图控制器。如果您希望首先出现启动画面,则从第一个选项卡中控制器的viewDidAppear方法以模态方式(没有动画)显示。完成该屏幕后,您可以将其关闭,然后您将进入第一个控制器。如果您进行了更改,那么在应用程序委托中执行您想要的操作将非常简单,

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
         UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;
         tbc.selectedIndex = 2;
  }

我还建议您学习Apple的“适用于iOS的View Controller编程指南”,以了解视图控制器及其生命周期。

答案 2 :(得分:0)

有一些方法可以在此线程上获得最顶层的视图控制器。 https://stackoverflow.com/a/23603265/

我喜欢这段代码,因为它非常简单。 https://stackoverflow.com/a/23603265/1971596

- (UIViewController*)topViewController {
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
    } else if (rootViewController.presentedViewController) {
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
    } else {
        return rootViewController;
    }
}

然后你只需从最顶层的视图控制器中呈现视图控制器。