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的时候要从通告中心删除对象
objective-c 通告的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法
NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...
- [转] 从 C 到 Objective C 入门1
转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...
- Objective C运行时(runtime)
#import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...
- Objective C ARC 使用及原理
手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...
- Objective -C学习笔记之字典
//字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...
- 刨根问底Objective-C Runtime
http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...
- Objective-C( Foundation框架 一 字符串)
Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...
- Objective C类方法load和initialize的区别
Objective C类方法load和initialize的区别 过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...
随机推荐
- 【NOI2012】魔幻棋盘
Description 将要读二年级的小 Q 买了一款新型益智玩具——魔幻棋盘,它是一个N行M列的网格棋盘,每个格子中均有一个正整数.棋盘守护者在棋盘的第X行Y列(行与列均从1开始编号) 并且始终不会 ...
- 简单的win7-cmd命令提示符
在win7打开cmd窗口 有两个路径:(1)开始 -->所有程序 --> 附件 --> 命令提示 (2)开始 -->在搜索框输入 “cmd” 指令 作用 对文件夹的操作 ...
- RocketMQ学习笔记(14)----RocketMQ的去重策略
1. Exactly Only Once (1). 发送消息阶段,不允许发送重复的消息 (2). 消费消息阶段,不允许消费重复的消息. 只有以上两个条件都满足情况下,才能认为消息是“Exactly O ...
- sort 排序 自定义排序算法的使用
// struct sort_by_pt// {// bool operator()(const std::pair<CString, AcGePoint3d> a, const std: ...
- ThinkPHP---AR模式
[前言] 在之前学习框架时介绍过 (1)什么是框架? ①框架是一堆包含了常量.方法和类等代码集合: ②半成品应用,只包含了项目开发时的底层架构,并不包含业务逻辑: ③包含一些设计模式,例如单例模式,工 ...
- 08Webpage Form
Webpage Form 表单(form)在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含 ...
- 【原】Python学习
1.常用模块介绍 #python -m SimpleHTTPServer 执行上面的命令就会在服务器当前目录下启动一个文件下载服务器,默认打开8000端口.这个时候,你只需要将IP和端口告诉客户端,即 ...
- node 实现Token状态登录 及数据库增删改查
1.项目目录结构 2.启动入口文件代码index.js const express = require('express') const bodyParser = require('body-pars ...
- C: 当字符数组首指针转化成char *指针,sizeof(*ptr)不为array的size
#include <stdio.h> #include <string.h> int main() { char a[10] = "\0"; char *p ...
- 22万个木箱!TWaver 3D极限压榨
打开个门户网站都千呼万唤,我们还能期待网页上的3D技术会有“酣畅淋漓”.“一气呵成”的感受吗?也许现在还差点火候.但是HTML5.WebGL等技术一直在飞速的发展,可能很快你就会惊讶它的能力.现在,我 ...