通知和代理区别和使用

(一)代理Delegate

1.使用的场合

主要用于子控件发生某些动作时,通知父控件,子控件的代理是父控件。常见就控制器就是子控件的的代理。

2.代理的使用步骤

1>先搞清除谁是谁的代理

2>定义代理协议,协议名称的规范是:控件类名+Delegate

3>定义代理方法

         *代理方法一般都定义@optional

         *代理方法名都以控件名开头   

         *代理方法至少一个参数,将控件本身传递出去

4>设置代理对象

         *代理对象遵守协议

         *代理对象实现协议里面的该实现的方法

5>在恰当的时候调用代理对象的代理方法,通知代理发生了什么事

用法:

1.系统定义好的代理:UITableViewDelegate

使用步骤:

1>遵守代理协议

2>实现协议的方法就行了(运行循环,监听代理的动作)

2.自定义的代理

在A中定义代理

A.h文件

// 前向引用

@classA;

@protocolaDelegate 

@optional

/**

*  代理方法

*/

- (void)aXXX:(A*)a;

@end

@interfaceA : NSObject

/**

*  代理属性

*/@property(nonatomic,weak) id delegate;

@end

A.m文件

@implementationA

/**

*  A发生某些事情,在xxx方法中通知代理B执行代理的操作

*/

- (void) xxx

{

if([self.Delegate respondsToSelector:@selector(aXXX:)]) 

{      

  [self.Delegate aXXX:self];   

 }

}

@end

B.m

#import"A.h"

@interfaceB 

@end

@implementationB

/** 

*  因为总部A发生事情执行了xxx方法,在xxx方法中通知代理B执行aXXX方法 

*@parama <#a description#> 

*/

- (void) aXXX:(A*)a

{

//操作某些事情

}

@end


(二)通知(NSNotification)

1.通知的属性

// 通知的名称

@property(readonly, copy)NSString*name;

// 通知的发布者

@property(readonly, retain)id object;

// 一些额外的信息

@property(readonly, copy)NSDictionary*userInfo;

2.初始化一个通知对象

-(instancetype)initWithName:(NSString*)name object:(id)object userInfo:(NSDictionary*)userInfo

+(instancetype)notificationWithName:(NSString*)aName object:(id)anObject;

+(instancetype)notificationWithName:(NSString*)aName object:(id)anObject userInfo:(NSDictionary*)aUserInfo;

3.发布通知

-(void)postNotification:(NSNotification*)notification;

-(void)postNotificationName:(NSString*)aName object:(id)anObject;

-(void)postNotificationName:(NSString*)aName object:(id)anObject userInfo:(NSDictionary*)aUserInfo;

4.注册通知监听器

1>

-(void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString*)aName object:(id)anObject;

//  observer:监听器

//  aSelector:收到通知后回到的方法,把通知对象当做参数传入

//  aName:通知的名字,为nil,无论通知名称是什么,监听器都能接受到这个通知

//  anObject:通知的发布者,anObject和name 都为nil,监听器能收到所有的通知

2>

-(id)addObserverForName:(NSString*)name object:(id)obj queue:(NSOperationQueue*)queue usingBlock:(void (^)(NSNotification*note))block;

//  name:通知的名称

//  obj:通知的发布者

//  block:收到对应的通知时,会回到的这个block

//  queue:决定block在那个队列中执行

5.注销通知监听器

-(void)removeObserver:(id)observer;

-(void)removeObserver:(id)observer name:(NSString*)aName object:(id)anObject;

通知中心不会保留监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册,否则相应的通知再次出现时,通知中心仍然会向监听器对象发送通知,相应的监听器已经不存在了,可能会导致应用崩溃

一般的用法:

// 监听通知

[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(changetext) name:UITextFieldTextDidChangedNotification object:self.accoutField];

// 接受到通知后执行的操作

- (void)changetext{}

// 移除监听

- (void)dealloc{    [[NSNotificationCenterdefaultCenter] removeObserver:self];}


(三)UIDevice通知

// 可以获得单例对象[UIDevice currentDevice];

发布通知的名称常量

// 设备旋转UIDeviceOrientationDidChangeNotification

// 电池状态改变UIDeviceBatteryStateDidChangeNotification

// 电池电量改变UIDeviceBatteryLevelDidChangeNotification

// 近距离传感器(比如设备贴近了使用者的脸部)UIDeviceProximityStateDidChangeNotification


(四)键盘通知

1.特定的通知

// 键盘即将显示UIKeyboardWillShowNotification

// 键盘显示完毕UIKeyboardDidShowNotification

// 键盘即将隐藏UIKeyboardWillHideNotification

// 键盘隐藏完毕UIKeyboardDidHideNotification

// 键盘的位置尺寸即将发生改变UIKeyboardWillChangeFrameNotification

// 键盘的位置尺寸改变完毕UIKeyboardDidChangeFrameNotification

2.键盘通知的额外信息

// 键盘刚开始的frameUIKeyboardFrameBeginUserInfoKey

// 键盘最终的frame(动画执行完毕后)UIKeyboardFrameEndUserInfoKey

// 键盘动画的时间UIKeyboardAnimationDurationUserInfoKey

// 键盘动画的执行节奏(快慢)UIKeyboardAnimationCurveUserInfoKey


(五)补充:

通知和代理的选择

1.共同点:都能完成对象之间的通信

2.不同点:

    *代理:一对一的关系

    *通知:多对多的关系

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 代理的使用步骤 定义一份代理协议协议名字的格式一般是:类名 + Delegate比如UITableViewDele...
    Yuann阅读 267评论 0 1
  • 代理 代理设计模式的作用: 1.A对象监听B对象的一些行为,A成为B的代理 2.B对象想告诉A对象一些事...
    Hevin_Chen阅读 198评论 0 0
  • 通知中心(NSNotificationCenter) 通知(NSNotification) 一个完整的通知一般包含...
    JonesCxy阅读 444评论 0 1
  • scrollView: 介绍scrollView一些属性<1>.要想使用scrollView必须做两件事1).设置...
    騂跃神话阅读 1,525评论 0 0
  • 心比天高 命比纸薄 一生不安 一世无名 关键时刻总是掉链子 再也没有疼痛
    江兆勇Jon阅读 282评论 0 0