如何处理视图控制器上的远程通知(而不是 AppDelegate)[关闭]
Posted
技术标签:
【中文标题】如何处理视图控制器上的远程通知(而不是 AppDelegate)[关闭]【英文标题】:How to handle remote notification on view controller (instead of AppDelegate) [closed] 【发布时间】:2013-07-31 17:47:35 【问题描述】:当收到推送通知 (didReceiveRemoteNotification) 时,如何将通知处理从应用委托传递给视图控制器? 这对于在视图上显示警报很有用。发布视图或其他相关内容。
AppDelegate.m 的伪代码示例:
- (void)application:(UIApplication*)application didReceiveRemoteNotification (NSDictionary*)userInfo
NSLog(@"Received notification: %@", userInfo);
// Here send the userInfo or other data to the appropriate view controller for handling it there (for example showing an alert there) //
【问题讨论】:
传递委托的目的是什么?也许有更好的方法。如果你真的需要它,你可能应该在你的 ViewControllerB 中定义一个自定义的初始化函数或属性来传递这个对象。 嗯,所以该代码示例在应用程序委托中,对吗?你声明了pushViewController:animated
方法吗?我想我有点困惑。
子类 viewControllerA 和 viewControllerB 来自同一个超类,然后将该超类作为委托
如果你想获得应用程序委托,你可以这样做[[UIApplication sharedApplication] delegate]
你不能在 1 个属性中有 2 个引用...只需重置委托,它将转移到新控制器...
【参考方案1】:
确实没有理由在应用程序周围传递 didReceiveNotification。它打算处理一次;话虽如此,我不太确定你为什么要传递一个代表。
如果您想将视图控制器置于其他一切之上(我不知道您的视图层次结构,所以我不知道这是否真的是您会使用的东西),您可以执行以下操作:
[[self.window rootViewController] presentViewController:[[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil] animated:YES completion:^];
这段代码只是在一切之上抛出一个模态视图。
或者,如果出于某种原因,您确实需要在更多地方处理通知,而不仅仅是应用程序委托,您可以做两件事:
委托模型
在 AppDelegate 标头中创建一个新的委托协议,并将其设置为您希望的任何处理程序 - 不利的一面(如上所述)是一次只有一个对象可以监听委托
@protocol MyNotificationDelegate <NSObject>
@required
-(void) applicationDidReceiveRemoteNotification: (NSDictionary*)userInfo;
@end
发布通知
任意数量的对象都可以收听此通知;在你想听的对象中:
AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ReceivedNotification" object:appDel];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationReceived:) name:@"ReceivedNotification" object:appDel];
并添加功能:
-(void)notificationReceived :(NSNotification *)localNot
NSLog(@"userInfo from push: %@",localNot.userInfo );
关于您的应用程序委托回调:
- (void)application:(UIApplication*)application didReceiveRemoteNotification: (NSDictionary*)userInfo
NSLog(@"Received notification: %@", userInfo);
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReceivedNotification" object:self userInfo:userInfo];
【讨论】:
以上是关于如何处理视图控制器上的远程通知(而不是 AppDelegate)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章