1. 通告和委托的区别
通告也能传递与事件相关的数据。通告不同于委托的地方在于,通告是在对象执行完成动作之后产生,而不是之前。受到通告的对象没有机会建议是否要执行动作,而且对象的通告可以有多个监听者(observer),但是只有一个委托对象。
2. 通告的工作机制
a. 对应用程序中其他地方发生的事件(比如增加一条数据库记录)感兴趣的对象,会向通告中心(Notification Center,NSNotificationCenter类的实例)注册,从而成为该事件的监听者。在注册过程中,监听者需要指定方法供通告中心在事件发 生时调用。
b.给数据库添加记录(或者类似事件)的对象给通告中心发一个通告(NSnotification的实例)。该通告对象包括识别通告的标志、发布通告的对象ID和可选的附加信息字典。
c.通告中心发送消息到每个已注册的监听者,调用监听者指定的方法会将通告传给这些监听者。
3.如何使用通告
a.通告如何工作
发布通告的类在头文件中将要通告的名称定义为静态NSString对象。例如NSWindow类在它的头文件中定义了16个通告,使其他对象可以监视该窗口的状态变化。
APPKIT_EXTERNNSString *NSWindowWillBeginSheetNotification;
b.通告的执行
下面的例子,通告中心一旦收到NSWindowWillBeginSheetNotification通告,就调用sheetDidBegin:方法。
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSNotificationCenter *center = [NSNotificationCenterdefaultCenter];
[centeraddObserver:selfselector:@selector(sheetDidBegin:)name:NSWindowWillBeginSheetNotificationobject:nil];
}
returnself;
}
- (void)sheetDidBegin:(NSNotification *)notification
{
NSLog(@"Notification: %@",[notificationname]);
}
c.要记得从通告中心删除对象
- (void)dealloc{
//防止通告中心将消息发给不存在的对象
[[NSNotificationCenterdefaultCenter]removeObserver:self];
[superdealloc];
}
4.自定义通告
a.首先定义通告的名称-- (在动作发送的那个类里面定义)
如我做的简单例子是View里面的一个按钮点击的时候通知主界面
extern NSString*ButtonClickedNotification; //@"ButtonClicked"
b.注册通告
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[ncaddObserver:selfselector:@selector(responseButtonClick:) name:ButtonClickedNotification object:nil];
c.处理通告
- (void)responseButtonClick:(NSNotification *)nt {
TestViewCtrl *currentViewCtrl = [nt object];
NSString *result = [currentViewCtrl value];
NSLog(@"valuefrom view:%@",result);
}
d.动作发生的时候发送通知给监听者
- (IBAction)clickBtn:(id)sender {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
self.value = @"Hello world";
[ncpostNotificationName:ButtonClickedNotification object:self];
}
f.最后,同上,dealloc的时候要从通告中心删除对象