objective-c 通告

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的时候要从通告中心删除对象

 

 

posted on 2013-09-24 10:47  陌上有缘  阅读(219)  评论(0)    收藏  举报