2013-12-13 43 views
0

當用戶得到推送通知時,我希望應用程序打開到某個UIViewController。我在xCode 5中有故事板。從推送通知的ios上的AppDelegate更改UIViewController

我覺得我的代碼是接近,但它拋出一個錯誤

這裏是方法的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

你確定nav是UINavigationController嗎? – rocky

+0

如果不知道故事板中的視圖控制器層次結構是什麼,很難回答你的問題。從錯誤中可以明顯看出,窗口的根視圖控制器是SplashViewController,而不是UINavigationController。那麼,你的等級是什麼? – rdelmar

+0

感謝您的回覆。我不清楚該層次結構如何工作。一直試圖找到這個教程,以更好地理解它。我對我的帖子進行了編輯,以提供有關層次結構的更多信息。讓我知道是否需要更多信息。 – tomjung

回答

0

我會做的第一件事就是修改結構,以便標籤欄控制器是窗口的根視圖控制器。如果你想讓你的閃屏首先出現,然後在第一個選項卡中的控制器中的viewDidAppear方法中以模態方式(無動畫)呈現。當你完成這個屏幕時,你可以放棄它,而你將成爲第一個控制器。如果你做出的改變,然後做你想做的事,應用程序的委託將是簡單的,

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

我也建議你學習蘋果的瞭解視圖控制器和他們的生活「iOS視圖控制器編程指南」週期。

0

這聽起來像你的根視圖控制器是類SplashViewController的視圖控制器。 SplashViewController是UINavigationController的子類嗎?它必須是,否則你會得到那個錯誤。

+0

啊,事實並非如此。它是UIViewController的一個子類。 RewardList也是UIViewController的子類,但它有一個導航控制器。所以我猜測nav是我的SplashViewController,因爲我的故事板默認是這樣的。我仍然不清楚如何從當前UIViewController更改爲RewardList UIViewController – tomjung

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

然後你從最頂部的視圖控制器只是當前視圖控制器。