2

我有UITableViewrootViewController的,我用解析的 RSS 填充该表(有一个Parser类,其中 myrootViewController是它的代表)。在rootViewController我有刷新 RSS 的方法中refreshData,我将检索到的数据保存在静态静态MutableArray项中:

在单击单元格中的tableView单元格时,同时detailView被推送 navigationController(在选择单元格(行)时)我创建字典并将其传递theItemdetailView. 在该字典中,我传递来自staticItemspositionInArray(所选单元格的索引)的值。这样我可以显示新闻的文本并跟踪新闻在新闻数组中的位置以实现幻灯片上一个/下一个。

现在,我启用了推送通知,并在收到一个通知后,我的应用程序回到了前台,但视图是上次关闭应用程序时打开的视图。

我想通过重新解析(刷新)RSS并呈现最新消息(theItem[0])来详细呈现最新消息

所以,我想得到以下结果:调用[rootController refreshData]然后选择单元格中的第一个项目并将其打开detailView

我一直在玩委托方法didReceiveRemoteNotification,但我找不到让它工作的方法。我尝试创建新rootController的,但随后将其堆叠在现有的之上:(。

请与我分享你的想法:)

4

1 回答 1

3

首先,这个问题根本与推送通知无关。更多的是如何从应用程序委托中的任意位置访问视图控制器的问题。

您最好(也可能是唯一)的选择是手动保留对相关视图控制器实例的引用。

我假设您使用UINavigationController根是您的列表的位置,然后将详细视图控制器推到它上面。在您的应用程序委托中保留对此导航控制器的引用。@property (nonatomic, retain) UINavigationController *mainNavController;向您的应用程序委托添加一个。创建导航控制器时,分配它以便应用程序委托具有引用。

MyAppDelegate *ad = ((MyAppDelegate *)[UIApplication sharedApplication].delegate);
ad.mainNavController = theNavController;

如果您在应用程序委托本身中创建导航控制器,您显然只需要这样做:

self.mainNavController = theNavController;

然后,当您收到推送通知时,只需直接对导航控制器进行操作。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    // Do whatever you need to do in order to create an instance of your
    // detail view controller
    MyDetailViewController *vc = [MyDetailViewController magicalStuff:userInfo];

    // Add the detail view controller to the stack, but keep the root view
    // controller.
    UIViewController *root = self.mainNavController.topViewController;
    NSArray *vcs = [NSArray arrayWithObjects:root, vc, nil];
    [self.mainNavController setViewControllers:vcs animated:YES];
}

然后导航控制器将MyDetailViewController通过滑动进行动画处理,后退按钮会将您带到列表。

于 2011-11-04T15:50:43.503 回答