通知 - NSNotificationCenter
1、每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信;
2、任何一个对象都可以向通知中心发布通知(NSNotification), 描述自己在做什么。其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知。
3、通知是多对多的关系:

4、一个完整的通知一般包含3个属性:
1)- (NSString *)name; //通知的名称
2)- (id)object; //通知发布者(是谁要发布通知)
3)- (NSDictionary *)userInfo; //一些额外的信息(通知发布者传递给通知接收者的信息内容)
5、初始化一个通知(NSNotification)对象的构造函数:
1) + (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
2) + (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
3) - (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
6、注册通知监听器:
通知中心提供了方法类注册一个坚挺通知的监听器(Observer):
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
-->observer: 监听器。即谁要接收这个通知
-->aSelector: 收到通知后,回调监听器的这个方法,并且把通知对象做为参数传入
--> aName: 通知的名称。如果为nil, 那么无论通知的名称是什么,监听器都能收到这个通知
--> anObject: 通知发布者。如果anObject和aName都为nil, 监听器都收到所有的通知
7、代码示例:
创建一个通知发布者类NewsCompany
NewsCompany.h文件代码:
#import <Foundation/Foundation.h> @interface NewsCompany : NSObject + (instancetype)newsCompanyWithName:(NSString *)name; //类构造方法
@property (nonatomic, copy) NSString *name; //消息发布者名称 @end
NewsCompany.m文件代码:
#import "NewsCompany.h"
@implementation NewsCompany
+ (instancetype)newsCompanyWithName:(NSString *)name{
NewsCompany *company = [[self alloc] init];
company.name = name;
return company;
}
@end
创建一个通知接受者类(监听者)Person
Person.h文件代码:
#import <Foundation/Foundation.h> @interface Person : NSObject + (instancetype)personWithName:(NSString *)name; //类实例方法
@property (nonatomic, copy) NSString *name; //监听对象的名称 //监听通知的方法
- (void)MonitorMessage:(NSNotification *)notification; @end
Person.m文件代码:
#import "Person.h" @implementation Person + (instancetype)personWithName:(NSString *)name
{
Person *per = [[self alloc] init];
per.name = name;
return per;
} - (void)MonitorMessage:(NSNotification *)notification
{
NSLog(@"监听者: %@,通知名称:%@, 其他信息:%@", self.name, notification.name, notification.userInfo);
} //就算在arc机制下,还是要移除当前监听者的所有监听行为
- (void)dealloc
{
NSLog(@"移除当前监听者: %@", self.name);
[[NSNotificationCenter defaultCenter] removeObserver:nil]; //移除当前监听者的所有监听行为
}
@end
main方法里执行代码为:
#import <Foundation/Foundation.h>
#import "NewsCompany.h"
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool { //创建两个发布通知者对象
NewsCompany *com1 = [NewsCompany newsCompanyWithName:@"腾讯"];
NewsCompany *com2 = [NewsCompany newsCompanyWithName:@"新浪"]; //创建五个监听者对象
Person *per1 = [Person personWithName:@"谭大"];
Person *per2 = [Person personWithName:@"毛二"];
Person *per3 = [Person personWithName:@"张三"];
Person *per4 = [Person personWithName:@"李四"];
Person *per5 = [Person personWithName:@"王五"]; //取得通知中心对象
NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; //设置两个通知的名称
NSString *notice1 = @"一路一带";
NSString *notice2 = @"亚投行"; //步骤1、先注册通知的监听者
/*
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
参数说明:
observer: 要注册的监听者对象
aSelector: 监听者的监听方法
aName: 通知名称,为nil表示监听者监听通知中心的所有通知
anObject: 通知发布者对象,为nil表示监听者监听所有的通知发布者
如果通知发布者没有发布某个通知,则注册为该通知发布者的监听者将监听不到信息
*/
[center addObserver:per1 selector:@selector(MonitorMessage:) name:nil object:nil];
[center addObserver:per2 selector:@selector(MonitorMessage:) name:notice1 object:nil];
[center addObserver:per3 selector:@selector(MonitorMessage:) name:nil object:com1];
[center addObserver:per4 selector:@selector(MonitorMessage:) name:notice1 object:com1]; //反列:per5对象注册的通知发布者com1没有发布通知notice2, 则per5监听者对象将监听不到通知
[center addObserver:per5 selector:@selector(MonitorMessage:) name:notice2 object:com1]; //步骤2、通知对象再发布通知
[center postNotificationName:notice1 object:com1 userInfo:@{@"otherInfo": @""}];
[center postNotificationName:notice2 object:com2 userInfo:@{@"otherInfo": @""}];
[center postNotificationName:notice1 object:com2 userInfo:@{@"otherInfo": @""}];
}
return ;
}
打印结果为:
监听者: 谭大,通知名称:一路一带, 其他信息:{ otherInfo = 1111111; }
监听者: 毛二,通知名称:一路一带, 其他信息:{ otherInfo = 1111111; }
监听者: 张三,通知名称:一路一带, 其他信息:{ otherInfo = 1111111; }
监听者: 李四,通知名称:一路一带, 其他信息:{ otherInfo = 1111111; }
监听者: 谭大,通知名称:亚投行, 其他信息:{ otherInfo = 2222222; }
监听者: 谭大,通知名称:一路一带, 其他信息:{ otherInfo = 3333333; }
监听者: 毛二,通知名称:一路一带, 其他信息:{ otherInfo = 3333333; }
移除当前监听者: 王五
移除当前监听者: 李四
移除当前监听者: 张三
移除当前监听者: 毛二
移除当前监听者: 谭大
说明:1)、当注册监听者时,通知名称和通知发布者为nil, 则默认监听者注册为通知中心的所有通知发布者的通知;
2)、如果注册监听者时,通知发布者没有发布该通知,则监听者监听不到该通知
UIDevice通知
1)、UIDevice类提供了一个单列对象,它代表着设备,通过它可以获得一些设备相关的信息,比如电池电量值(batteryLevel)、电池状态(batteryState)、设备的类型(model, 比如iPod、iPhone等) 、设备的系统(systemVersion)
2)、通过[UIDevice currentDevice]可以获取这个单列对象
3)、UIDevice对象会不间断的发布一些通知,下列是UIDevice对象所发布通知的名称常量:
UIDeviceOrientationDidChangeNotification //设备旋转
UIDeviceBatteryStateDidChangeNotification //电池状态改变
UIDeviceBatteryLevelDidChangeNotification //电池电量改变
UIDeviceProximityStateDidChangeNotification //近距离传感器( 比如设备贴近了使用者的脸部)
键盘通知:
键盘状态改变的时候,系统会发出一些特定的通知
UIKeyboardWillShowNotification //键盘即将显示
UIKeyboardDidShowNotification //键盘显示完毕
UIKeyboardWillHideNotification //键盘即将隐藏
UIKeyboardDidHideNotification //键盘隐藏完毕
UIKeyboardWillChangeFrameNotification //键盘的位置尺寸即将发生改变
UIKeyboardDidChangeFrameNotification //键盘的位置尺寸改变完毕
9、设置文本框的边距,假设文本框变量名为inputV
inputV.leftView = [UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];//设置边距
inputV.leftViewMode = UITextFieldViewModeAlways; //设置左边距模式
10、通知示例,监听viewController上的文本框变化
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//监听开始编辑文本框
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tanBeginEditText) name:UITextFieldTextDidBeginEditingNotification object:nil];
//监听改变文本框内容
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tanChangeText) name:UITextFieldTextDidChangeNotification object:nil];
//监听结束文本框编辑
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tanEndEditText) name:UITextFieldTextDidEndEditingNotification object:nil];
}
//监听开始编辑文本框
- (void)tanBeginEditText{
NSLog(@"开始编辑");
}
//监听文本框编辑过程
- (void)tanChangeText{
NSLog(@"正在输入文字....");
}
//监听文本框结束
- (void)tanEndEditText{
NSLog(@"结束编辑");
}
运行打印结果:
开始编辑
正在输入文字....
正在输入文字....
正在输入文字....
结束编辑
通知 - NSNotificationCenter的更多相关文章
- iOS之 利用通知(NSNotificationCenter)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项
我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框. 但实现时你会发现,在不同的手机上键盘的高度是不同的.这里列举一下: //获取键盘的高度 /* iphone 6: 中文 ...
- OC学习篇之---通知(NSNotificationCenter)
在前一篇文章中我们介绍了OC中很常用的两个技术:KVC和KVO: http://blog.csdn.net/jiangwei0910410003/article/details/41912937,今天 ...
- 通知NSNotificationCenter
注意:接受通知要写在 viewDidLoad 方法里面 取得系统全局的唯一广播站 NSNotificationCenter *notification = [NSNotificationCenter ...
- iOS通知NSNotificationCenter
NSNotificationCenter消息通信 作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificat ...
- ios注册通知NSNotificationCenter(一)
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter] ...
- 通知(NSNotificationCenter)
// 监听加载更多的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadMoreDeals ...
- NSNotificationCenter通知中心
概述 NSNotificationCenter通知中心,通常用于一对一或者一对多的消息传递,即当一个地方改变时,要求改变其他的一些地方,例如当网络请求回来了新的数据,需要刷新本地信息和本地内存里面的界 ...
- iOS中通知中心NSNotificationCenter应用总结
通知中心(NSNotificationCenter)实际是在程序内部提供了一种广播机制.把接收到的消息,根据内部的消息转发表,将消息转发给需要的对象.这句话其实已经很明显的告诉我们要如何使用通知了.第 ...
- Swift - 使用NSNotificationCenter发送通知,接收通知
转载自:http://www.mamicode.com/info-detail-1069228.html 标签: 1,通知(NSNotification)介绍 这里所说的通知不是指发给用户看的通知消息 ...
随机推荐
- G++ 参数介绍(转载)
g++参数介绍 From: http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html gcc and g++分别是gnu的c & ...
- 解决AndroidADT自带Eclipse编辑器不能自动代码提示的问题。
今天发现,我下载的AndroidADT开发套装中自带的Eclipse没有自动代码提示功能.通过参考http://blog.csdn.net/coolszy/article/details/724195 ...
- 基于HT for Web的3D拓扑树的实现
在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在 ...
- CSS布局:水平居中
前言 一直对CSS布局一知半解,这段时间打算定下心来好好学习一下,于是先从最简单的水平居中布局开始入手.下面以分页组件为实例来记录各种实现方式. common.css <style type=& ...
- 【Swift学习】Swift编程之旅---属性(十四)
属性关联特定类.结构或枚举的值,存储属性将存储常量和变量作为实例的一部分,计算属性用于计算一个值,而不进行存储.计算属性可以用于类.结构体和枚举里,存储属性只能用于类和结构体.存储属性和计算属性通常用 ...
- [译]学习IPython进行交互式计算和数据可视化(七)
第六章:定制IPython 对于高级用户,IPython可以进行定制和扩展.在本章结束之后,你将会知道: 怎样创建和使用自定义配置文件 怎样为高级功能进行IPython扩展 怎样在notebook中使 ...
- C语言学习009:管道连接输入输出
现在我们需要对gpsdata.csv文件中的数据进行筛选,然后将符合条件的数据输出到output.json文件中,第一种方式当然是在之前的代码中进行修改,但是如果我们不想修改原来的代码就能得到我们期望 ...
- Socket开发框架之数据传输协议
我在前面一篇随笔<Socket开发框架之框架设计及分析>中,介绍了整个Socket开发框架的总体思路,对各个层次的基类进行了一些总结和抽象,已达到重用.简化代码的目的.本篇继续分析其中重要 ...
- asp.net中Ajax控件的用途(一)
1,UpdatePanel控件,用户更新部分内容,示例 放入一个Label和一个Button,单击按钮,label显示当前时间. 2,ScriptManagerProxy控件,每个页面只能有一个Scr ...
- 为sql server 增加 parseJSON 和 ToJSON 函数
在SqlServer中增加Json处理的方法 Sql Server 存储非结构话数据可以使用xml类型,使用xpath方式查询,以前写过一篇随笔:Sql Server xml 类型字段的增删改查 除了 ...