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

objective-c 通告的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  3. Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法

    NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...

  4. [转] 从 C 到 Objective C 入门1

    转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...

  5. Objective C运行时(runtime)

    #import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...

  6. Objective C ARC 使用及原理

    手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...

  7. Objective -C学习笔记之字典

    //字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...

  8. 刨根问底Objective-C Runtime

    http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...

  9. Objective-C( Foundation框架 一 字符串)

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  10. Objective C类方法load和initialize的区别

    Objective C类方法load和initialize的区别   过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...

随机推荐

  1. C#和C++的区别(一)

    C#特性 1.指针可以有++.--运算,引用不可以运算: 2.类或结构的默认访问类型是internal 类的所有成员,默认是private 3.属性:用于定义一些命名特性,通过它来读取和写入相关的特性 ...

  2. C# 输出控制台结果到文件

    StreamWriter sw = new StreamWriter(@"c:\output.txt"); Console.SetOut(sw); Console.WriteLin ...

  3. 小白的python之路 序

    计算机专科毕业,.net开发已有8年有余,中途断断续续,似懂非懂,积累了一些经验知识,但是不求甚解,属于那种一瓶不满半瓶子晃荡,这么一个状态. 主要从事web开发,涉及一些前端jq等,还有接口开发,搜 ...

  4. Echarts修改legend样式

    legend: { icon: 'rect', itemWidth: 20, itemHeight: 10, itemGap: 10}

  5. 关于ds添加datarow

    有一个dataset DS.如果我想将DS中的某一行复制,得到新的一行,添加到DS中. 可能就会想到:DS.Tables[0].Rows.Add(DS.Tables[0].Rows[i])但是这样程序 ...

  6. React Native 出现红屏幕报连接服务失败

    最近移动项目组在本人的带领下切换进React Native开发应用,之前没接触过,用了几周之后,发现也就那么回事吧,小玩具项目用用还是可以的.今天Android小姑娘在Windows下出问题解决不了, ...

  7. spark web ui

    spark UI 界面:http://www.cnblogs.com/xing901022/p/6445254.html 几个概念的解释:http://blog.csdn.net/jiangwlee/ ...

  8. JavaScript开发心得--如何传递某行数据给下一页

    1, 应用场景 在某个html页面显示一批数据,如20个用户的名称.年龄等,每行都要一个编辑按钮,点击编辑后,将此行数据带入某个专门的编辑页进行显示,修改后保存. 问题是 点击编辑按钮后,如何得知要编 ...

  9. C/C++ static、extern

    一.static本质作用 与static相对的关键字是auto,两者是一对.我们一般声明变量,如:int a,其实都是auto int a,只是auto省略了而已,但是static不能省略.要理解st ...

  10. .ai域名注册已经极具投资价值进入火爆期

    最近G.ai以六位数的天价被国内域名收藏家收入囊中,间接说明了.ai域名的价值不断攀升,自从2016年AlphaGo胜利以来,人工智能几乎成为人人谈资,而由于.com域名被挖掘待尽,一些聪明的人工智能 ...