美文网首页
通知和代理区别和使用

通知和代理区别和使用

作者: Asserts | 来源:发表于2016-06-14 14:11 被阅读0次

(一)代理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.不同点:

    *代理:一对一的关系

    *通知:多对多的关系

相关文章

  • 通知和代理区别和使用

    (一)代理Delegate 1.使用的场合 主要用于子控件发生某些动作时,通知父控件,子控件的代理是父控件。常见就...

  • iOS 代理(delegate)和通知(NSNotificati

    1. 代理和通知的区别?

  • iOS 代理和通知

    代理和通知的区别 效率:代理比通知高; 关联:delegate是强关联,委托和代理双方互相知道。通知是弱关联,不需...

  • iOS 面试题

    1. 代理和通知的区别 效率:代理比通知高; 关联:delegate是强关联,委托和代理双方互相知道。通知是弱关联...

  • 代理,通知,和block的区别

    1.NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通...

  • 代理和通知

    层级关系浅使用代理,深层次使用通知 通知 如果在一个类中想要执行另一个类中的方法可以使用通知 1.创建一个通知对象...

  • 代理 和 通知

    代理 1,准确的说是一种软件设计模式 2,iOS当中以@protocol 形式体现 3,传递方式一对一 (通知一对...

  • block和代理的,通知的区别

    http://www.jianshu.com/p/33753c326232

  • 通知、代理、block的区别和用法

    区别 1.NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应...

  • Spring_AOP_02——实现原理

    本文主要讲实现AOP的 代理模式原理,以及静态代理,动态代理的区别和具体实现。 对SpringAOP的概念和使用,...

网友评论

      本文标题:通知和代理区别和使用

      本文链接:https://www.haomeiwen.com/subject/bvrudttx.html