我需要一次向多个对象发送一条消息,然后从每个对象传回一个值。代表一次只能使用一个,通知不能返回值。
包含两个视图控制器的标签栏控制器是否可以同时通知两个视图控制器并返回值?
答案 0 :(得分:1)
我假设问题是如何让通知的收件人将回复发送回通知的发件人。
您不能只从通知中返回值。但是通知处理程序可以在原始对象中调用一个方法,以便提供您想要传递给它的任何数据。
这样做的一种方法是提供object
postNotificationName
参数,指定谁发送了通知。然后让object
(notificationSender
)符合某些已建立API的协议。例如,为视图控制器将调用的方法定义协议:
@protocol MyNotificationProtocol <NSObject>
- (void)didReceiveNotificationResponse:(NSString *)response;
@end
然后,发出通知的对象将符合此协议:
@interface MyObject : NSObject <MyNotificationProtocol>
@end
@implementation MyObject
- (void)notify
{
NSDictionary *userInfo = ...;
// note, supply a `object` that is the `notificationSender`
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:self userInfo:userInfo];
}
- (void)didReceiveNotificationResponse:(NSString *)response
{
NSLog(@"response = %@", response);
}
@end
然后,接收通知的视图控制器可以使用object
对象的NSNotification
参数发送响应:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:kNotificationName object:nil];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)didReceiveNotification:(NSNotification *)notification
{
id<MyNotificationProtocol> sender = notification.object;
// create your response to the notification however you want
NSString *response = ...
// now send the response
if ([sender conformsToProtocol:@protocol(MyNotificationProtocol)]) {
[sender didReceiveNotificationResponse:response];
}
}
在上面的示例中,响应为NSString
,但您可以使用所需的任何类型的参数didReceiveNotificationResponse
,或添加其他参数(例如sender
响应)。
答案 1 :(得分:0)
您可以创建一个键值对,并将其传递给通知的userInfo字典:
[[NSNotificationCenter defaultCenter] postNotificationName:myNotification object:nil userInfo:myDictionary];
在处理通知的方法中:
- (void)handleMyNotification:(NSNotification *)notification
{
NSDictionary *myDictionary = notification.userInfo;
}
答案 2 :(得分:0)
您可以将用户信息字典传递给通知:
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:isReachable]
forKey:@"isReachable"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:self userInfo:dataDict];
似乎问题与我之前想到的不同。如果你只是想发送通知并在发送通知的对象内部之后立即返回一些值,我可能会用一些方法包装它
- (NSString *)notifyAboutSomethingFancy
{
//the code from above
return @"whatever you want to return";
}
答案 3 :(得分:0)