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

iOS-收到推送通知后显示视图,ios,uinavigationcontroller,push-notification,apple-push-notifications,Ios,Uinavigationcontroller,Push Notification,Apple Push Notifications,我正在开发一个应用程序,它的主界面基于一个选项卡栏控制器 在其中一个选项卡中,我有一个集合视图,它通过导航控制器深入到详细视图 我试图做的是在收到推送通知后,我希望选择此特定选项卡,从服务器获取最新数据,找到要显示的特定项目,然后将详细视图推送到屏幕上以显示所述项目 我的问题是我在collectionView之后收到以下消息:didSelectItemAtIndexPath: 由于未捕获异常“NSGenericeException”而终止应用程序, 原因:“找不到segue的导航控制器。” “收

我正在开发一个应用程序,它的主界面基于一个选项卡栏控制器

在其中一个选项卡中,我有一个集合视图,它通过导航控制器深入到详细视图

我试图做的是在收到推送通知后,我希望选择此特定选项卡,从服务器获取最新数据,找到要显示的特定项目,然后将详细视图推送到屏幕上以显示所述项目

我的问题是我在collectionView之后收到以下消息:didSelectItemAtIndexPath:

由于未捕获异常“NSGenericeException”而终止应用程序, 原因:“找不到segue的导航控制器。” “收藏夹项”。推送序列只能在源 控制器由UINavigationController的实例管理。'

以下是我目前正在做的事情:

应用程序代理应用程序:DidReceivereMotentification:

[self selectFavouritesTab];
NHFavouritesViewController *favouritesViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"Favourites"];
[favouritesViewController displayFavouriteForPushNotificationWithId:favouriteId];
从FavoriteSviewcontroller-获取最新的收藏夹后,我向DisplayFavoriteItemWithID发送一条消息:

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

就在这一点上,它崩溃了。我理解崩溃消息的意思,但我不知道如何将NHFavoriteSviewcontroller放置在导航控制器中(该控制器嵌入在故事板的导航控制器中)当我在app delegate中响应推送通知时?

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

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

因此,当您告诉它推送时,它不能,因为您没有从故事板实例化导航控制器

导航控制器可能已经存在,因此您需要掌握它,而不是创建新的控制器


我现在在手机上,所以不能完全回答,但如果你还在挣扎,请告诉我,我会看看我是否能完成广告代码。不过prob需要先查看更多代码

您可以将视图控制器包装到标准导航控制器中,其中包含:

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:favouritesViewController];
但我无法从上面的代码中看出tabBarController中如何显示FavoritesViewController。如果您是在故事板中执行此操作,则只需拖动空白导航控制器,将tabBarController的相关选项卡挂接到导航控制器(Ctrl-drag,然后选择“关系segue:ViewController”,然后从导航控制器挂接到您最喜欢的ViewController(同样)

编辑:

如果已经在情节提要中完成了,那么您需要修改代码以获取现有版本的
nhfavoritesviewcontroller
,而不是实例化新的(假设您在
self.tabBarController
中有对选项卡栏控制器的引用,并且
FavoriteSviewcontroller
位于索引为
FavoriteStab
的选项卡中(我假设您可以获得这些,因为您已经有了选择选项卡的方法):


我很感激你所说的,但是我不确定如何从故事板实例化导航控制器,然后将消息发送到NHFavoriteSviewcontroller中的方法,然后这些方法将使用所述导航控制器。如果你能够在可用时提供帮助,那将非常好。是的,我知道你可以这样做,但我的问题是我在哪里这样做,当然,我最初在app delegate中响应通知,在app delegate中我将消息发送给favoritesviewcontroller。我将消息发送给selectfavoritestab(如上所述)要选择收藏夹选项卡,只需设置tabBarController的selectedIndex,tabBarController是应用程序的根视图控制器。收藏夹ViewController已嵌入到序列图像板中的导航控制器中,该控制器连接到选项卡栏控制器。在AppDelegate代码中,您正在创建一个全新的收藏夹ewController,它未嵌入NavigationController中。因此出现错误。您需要获取对现有收藏夹ViewController的引用,而不是实例化新控件。为此,您可以使用tabBarController的viewControllers属性。非常感谢,我犯了一个学童错误;-)在你的回答中加上你最后的评论,我会接受的。
UINavigationController *navController = (UINavigationController *)self.tabBarController.viewControllers[favouritesTab];
NHFavouritesViewController *favouritesViewController = (NHFavouritesViewController *) navController.rootViewController;