当用户获得推送通知时,我希望应用程序打开某个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选项卡。
我在这方面发现了很多帖子,但在我的案例中似乎没有任何作用。
答案 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;
}
}
然后你只需从最顶层的视图控制器中呈现视图控制器。