iOS - 收到推送通知后的显示视图

问题描述:

我正在研究其主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放置在导航控制器(它嵌入在故事板中的一个内)中?

您可以在一个标准的导航控制器封装一个视图控制器:

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

您遇到的问题是您没有实例化导航控制器。

通过使用该方法加载收藏视图,您实际上只创建一个视图控制器。

那么当你告诉它推动它时不能,因为你没有从故事板实例化导航控制器。

机会是导航控制器已经存在,所以你需要掌握,而不是创建新的控制器。

我现在正在使用移动设备,因此无法完全回答,但请告诉我,如果您仍在努力,我会看看我是否可以完成广告代码。然而,prob将需要首先看到更多的代码。

+0

我很欣赏你说的话,但是我不确定如何从故事板实例化导航控制器,然后将消息发送到NHFavouritesViewController中的方法,然后使用该导航控制器。如果你能够提供帮助, – Nick 2014-10-04 11:22:01