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

Posted

技术标签:

【中文标题】iOS - 收到推送通知后显示视图【英文标题】:iOS - Display view after push notification is received 【发布时间】:2014-10-04 10:01:29 【问题描述】:

我正在开发一个主 UI 基于标签栏控制器的应用。

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

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

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

由于未捕获的异常“NSGenericException”而终止应用程序, 原因:'找不到用于 segue 的导航控制器 '最喜欢的项目'。 Push segues 只能在 source 时使用 控制器由 UINavigationController 的实例管理。'

这是我目前正在做的事情:

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

【讨论】:

是的,我知道你可以这样做,但是我的问题是我这样做的地方,因为我最初在应用程序委托中响应通知,这是我将消息发送到 favouritesViewController 的地方。我向 selectFavouritesTab(如上)发送一条消息以选择收藏夹选项卡,它只是设置 tabBarController 的 selectedIndex ,它是应用程序的根视图控制器。 FavouritesViewController 已经嵌入到故事板中的导航控制器中,该控制器连接到标签栏控制器。 在您的 AppDelegate 代码中,您正在创建一个全新的 FavouritesViewController,它没有嵌入到 NavigationController 中。因此错误。您需要获取对现有 FavouritesViewController 的引用,而不是实例化一个新的。为此,您可以使用 tabBarController 的 viewControllers 属性。 非常感谢,这是我的一个小学生错误 ;-) 将您的最后一条评论添加到您的答案中,然后我会接受。【参考方案2】:

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

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

那么当你告诉它推送时它不能推送,因为你没有从情节提要中实例化导航控制器。

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

我现在正在使用手机,因此无法完全回答,但如果您仍在苦苦挣扎,请告诉我,我会看看是否可以添加完成的代码。不过,可能需要先查看更多代码。

【讨论】:

我很欣赏你所说的,但是我不确定如何从情节提要中实例化导航控制器,然后将消息发送到 NHFavouritesViewController 中的方法,然后这些方法将使用所述导航控制器。如果您能在有空时提供帮助,那就太好了。

以上是关于iOS - 收到推送通知后显示视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 在收到推送通知事件时更改视图的内容

避免在收到推送通知 ios 时加载主视图控制器

收到推送通知时推送视图控制器 iOS

用户收到推送通知后更新表视图中的数据

即使 Azure 推送通知遥测显示“成功”,也未收到 iOS 推送通知

收到多个推送通知时应用程序冻结