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

通知和代理区别和使用

作者: 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.不同点:

        *代理:一对一的关系

        *通知:多对多的关系

    相关文章

      网友评论

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

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