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. linux编译安装gcc5.3.0

    1.下载GCC5.3.0安装包 #su #cd /opt #wget http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz 2.解压 #.tar. ...

  2. Android 性能优化(9)网络优化( 5)Optimizing Server-Initiated Network Use

    Optimizing Server-Initiated Network Use This lesson teaches you to Send Server Updates with GCM Netw ...

  3. SpringBoot 2.x (1):手动创建项目与自动创建项目

    SpringBoot 2.x基于Spring Framework 5.x 环境需求如下: JDK1.8或以上 Maven3.2或以上 这里我使用的是Eclipse,IDEA这个工具很强大,但不习惯它 ...

  4. input checkbox 选择内容输出多少个

    <input type="checkbox" name="qId" onclick="doit();"/><input t ...

  5. 华硕(ASUS)X554LP笔记本重装win7后网卡和USB驱动问题的解决

    以前在其它笔记本上采用U盘克隆安装winxp系统非常顺利,各种硬件驱动能自动识别并安装. 手上有一台别人的华硕(ASUS)X554LP笔记本,原装win8.1,用不惯,想装个win7旗舰版. 照例去系 ...

  6. 【C++】智能指针简述(二):auto_ptr

    首先,我要声明auto_ptr是一个坑!auto_ptr是一个坑!auto_ptr是一个坑!重要的事情说三遍!!! 通过上文,我们知道智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析 ...

  7. WinRT ListView间隔变色(二)

    上文说到,WinRt中,我们不能在Style的Setter使用Binding.这个问题其实从SL5之前,一直都不可以.但是,为了使用强大的Binding,人们也一直想使用各种方法来达到Binding ...

  8. How a stack frame works 栈帧的要素与构建步骤

    http://en.citizendium.org/wiki/Stack_frame To use a stack frame, a thread keeps two pointers, often ...

  9. Django基础核心技术之Model模型的介绍与设计

    Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Mode ...

  10. R语言学习 - 热图美化

    实际应用中,异常值的出现会毁掉一张热图.这通常不是我们想要的.为了更好的可视化效果,需要对数据做些预处理,主要有对数转换,Z-score转换,抹去异常值,非线性颜色等方式. 对数转换 为了方便描述,假 ...