繁体   English   中英

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

[英]iOS - Display view after push notification is received

我正在开发一个主UI基于选项卡栏控制器的应用程序。

在其中一个标签中,我有一个收集视图,可通过导航控制器向下钻取到详细视图。

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

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

由于未捕获的异常“ NSGenericException”而终止了应用程序,原因:“找不到针对“ FavouriteItem”的导航控制器。 仅当源控制器由UINavigationController的实例管理时,才可以使用推送选择。

到目前为止,这是我正在做的事情:

应用程序委托应用程序: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];

但是我从上面的代码中看不到tabBarController中如何显示favouritesViewController。 如果要在情节提要中执行此操作,则只需将其拖动到空白的导航控制器中,将tabBarController的相关选项卡钩到导航控制器上(按Ctrl并拖动,然后选择“ Relationship segue:viewControllers”,然后从导航控制器中钩住到您的FavouritesViewController(同样)。

编辑:

如果在情节NHFavouritesViewController已完成此操作,则需要修改代码以使用NHFavouritesViewController的现有版本,而不是实例化新版本。 像这样(假设您在self.tabBarController引用了标签栏控制器,并且favouritesViewController在索引为favouritesTab的标签中(由于您已经有了选择标签的方法,我想可以得到它们):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM