作为iPhone开发的新手,我正慢慢到那里,但有时简单的事情似乎让我感到困惑。
我的应用程序包含7个非常不同的视图。它被实现为没有导航控制器的基于窗口的应用程序。导航由每个视图控制器单独管理,我使用中央数据存储库通过应用程序提供数据。
我用: -
DetailView *viewDetail = [[DetailView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:viewDetail animated:YES];
更改视图。显然,在所有情况下,这都是在当前视图的控制器中执行的。
但是,我现在已将推送通知添加到应用程序中。收到Push后,userInfo数据在主AppDelegate中可用,并执行didReceiveRemoteNotification。我希望将应用程序强制转换为上面描述的Detailview,并将其传递给userInfo中的一个值。
当然,一旦执行第二行,我就会得到一个很好的SIGABRT。我认为这是因为当前活动的视图不是自我的。如何从应用程序委托中放弃当前视图以支持DetailView?当前视图可能是7个视图中的任意一个,包括DetailView,我想用新数据刷新。
提前致谢 Chris Hardaker
答案 0 :(得分:12)
这是一个小小的注释,但您使用的命名约定是非标准的。而不是,
DetailView *viewDetail = [[DetailView alloc] initWithNibName:nil bundle:nil];
传统上,iOS开发人员希望看到以下内容:
DetailViewController *viewDetail = [[DetailViewController alloc] initWithNibName:nil bundle:nil];
因为viewDetail是UIViewController的子类而不是UIView。
为了回答你的主要问题,我会使用NSNotificationCenter。基本上,这允许任何类发布通知,这或多或少只是抛出事件发生在任何恰好正在侦听它的类的事实。
所以在didReceiveRemoveNotification:
你可以打电话:
[[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotification" object:nil userInfo:userInfo];
分配视图控制器时,请运行以下行:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushNotificationReceived:) name:@"pushNotification" object:nil];
您需要在每个视图控制器中放置一个名为pushNotificationReceived: (NSNotification*)aNotification
的方法来处理通知。您传递的userInfo字典将是通知的属性。
现在,当发送@“pushNotification”通知时,您的控制器将收到通知并运行给定的选择器。因此,您可以关闭控制器或显示详细视图或任何您想要的内容。
取消分配视图控制器时,请务必调用
[[NSNotificationCenter defaultCenter] removeObserver:self];