1

我正在研究其主UI基於選項卡欄控制器的應用程序。iOS - 收到推送通知後的顯示視圖

在其中一個選項卡中,我有一個集合視圖,通過導航控制器鑽取到詳細視圖。

我想要做的是收到推送通知後,我想選擇此特定選項卡,從服務器獲取最新數據,找到要顯示的特定項目,然後將詳細視圖推送到屏幕上以顯示所述項目。

我的問題是我得到的CollectionView後以下消息:didSelectItemAtIndexPath:

終止應用程序由於未捕獲的異常「NSGenericException」, 原因:「找不到賽格瑞 導航控制器‘FavouriteItem’。只有當源控制器由UINavigationController的一個實例管理時,才能使用push segues。'

這裏是我到目前爲止做:

應用代表應用程序:didReceiveRemoteNotification:

[self selectFavouritesTab]; 
NHFavouritesViewController *favouritesViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"Favourites"]; 
[favouritesViewController displayFavouriteForPushNotificationWithId:favouriteId]; 

從FavouritesViewController - 獲取最新的收藏夾之後,我發信息給displayFavouriteItemWithId:

- (void)displayFavouriteItemWithFavouriteId:(NSNumber*)favouriteId 
{ 
    NSArray* results = [_collectionViewData filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.favouriteId == %@", favouriteId]]; 

    NSInteger row = [_collectionViewData indexOfObject:[results lastObject]]; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
    [[self collectionView] selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone]; 
    [self.collectionView.delegate collectionView:self.collectionView didSelectItemAtIndexPath:indexPath]; 
    [self performSegueWithIdentifier:@"FavouriteItem" sender:self]; 
} 

而現在它正在崩潰。我明白什麼是崩潰消息,但是我不知道如何在應用程序委託中響應推送通知時,將NHFavouritesViewController放置在導航控制器(它嵌入在故事板中的一個內)中?

回答

1

您可以在一個標準的導航控制器封裝一個視圖控制器:

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:favouritesViewController]; 

但我無法從你上面的代碼favouritesViewController如何在tabBarController提出見。如果您是在故事板中進行操作,只需拖動一個空白導航控制器,將tabBarController的相關選項卡掛接到導航控制器(按住Ctrl鍵並拖動,然後選擇「Relationship segue:viewControllers」,然後從導航控制器中掛接到你的FavouritesViewController(同樣)。

編輯:

如果已經在故事板完成的,那麼你需要修改你的代碼,以皮卡的NHFavouritesViewController的現有版本,而不是新的實例。喜歡的東西(假設你有self.tabBarController您的標籤欄控制器的引用,而favouritesViewController與指數favouritesTab(我假設你可以得到這些,因爲你已經有了選擇的選項卡的方法)的標籤:

UINavigationController *navController = (UINavigationController *)self.tabBarController.viewControllers[favouritesTab]; 
NHFavouritesViewController *favouritesViewController = (NHFavouritesViewController *) navController.rootViewController; 
+0

是的,我知道你可以做到這一點,但是我的問題是我做這件事的地方,當然我最初在應用程序委託中響應通知,這是我發送消息給favouritesViewController的地方。 我發送一條消息給selectFavouritesTab(如上所述)來選擇收藏夾選項卡,該選項卡簡單地設置tabBarController的selectedIndex,它是應用程序的根視圖控制器。 FavouritesViewController已經嵌入到故事板中的導航控制器中,故事板連接到標籤欄控制器。 – Nick 2014-10-04 11:40:16

+0

在你的AppDelegate代碼中,你正在創建一個全新的FavouritesViewController,它並沒有嵌入到NavigationController中。因此錯誤。您需要獲取對現有FavouritesViewController的引用,而不是實例化一個新引用。要做到這一點,你可以使用tabBarController的viewControllers屬性。 – pbasdf 2014-10-04 11:44:57

+0

非常感謝你,我的一個小學生的錯誤;-)添加你的最後評論到你的答案,然後我會接受它。 – Nick 2014-10-04 11:57:02

1

您遇到的問題是您沒有實例化導航控制器。

通過使用該方法加載收藏視圖,您實際上只創建一個視圖控制器。

那麼當你告訴它推動它時不能,因爲你沒有從故事板實例化導航控制器。

機會是導航控制器已經存在,所以你需要掌握,而不是創建新的控制器。

我現在正在使用移動設備,因此無法完全回答,但請告訴我,如果您仍在努力,我會看看我是否可以完成廣告代碼。然而,prob將需要首先看到更多的代碼。

+0

我很欣賞你說的話,但是我不確定如何從故事板實例化導航控制器,然後將消息發送到NHFavouritesViewController中的方法,然後使用該導航控制器。如果你能夠提供幫助, – Nick 2014-10-04 11:22:01