码迷,mamicode.com
首页 > 其他好文 > 详细

5、通知和代理区别和使用

时间:2015-08-29 06:20:22      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:delegate   通知   

一、代理Delegate

1.使用的场合

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

2.代理的使用步骤

1> 先搞清除谁是谁的代理
2> 定义代理协议,协议名称的规范是:控件类名+Delegate
3> 定义代理方法
    *代理方法一般都定义@optional
    *代理方法名都以控件名开头
    *代理方法至少一个参数,将控件本身传递出去
4> 设置代理对象
    *代理对象遵守协议
    *代理对象实现协议里面的该实现的方法
5> 在恰当的时候调用代理对象的代理方法,通知代理发生了什么事

用法:
1.系统定义好的代理:UITableViewDelegate
使用步骤:

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

2.自定义的代理
在A中定义代理

A.h文件
// 前向引用
@class A;
@protocol aDelegate <NSObject>

@optional
/**
 *  代理方法
 */
- (void)aXXX:(A*)a;

@end
@interface A : NSObject
/**
 *  代理属性
 */
@property(nonatomic,weak) id <aDelegate> delegate;

@end

A.m文件

@implementation A
/**
 *  A发生某些事情,在xxx方法中通知代理B执行代理的操作
 */
- (void) xxx
{
    if ([self.Delegate respondsToSelector:@selector(aXXX:)]) {
        [self.Delegate aXXX:self];
    }
}
@end

B.m

#import "A.h"
@interface B <aDelegate>
@end

@implementation B

/**
 *  因为总部A发生事情执行了xxx方法,在xxx方法中通知代理B执行aXXX方法
 *
 *  @param a <#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;

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

一般的用法:

// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changetext) name:UITextFieldTextDidChangedNotification object:self.accoutField];

// 接受到通知后执行的操作
- (void)changetext{}

// 移除监听
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

三、UIDevice通知

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

发布通知的名称常量

// 设备旋转
UIDeviceOrientationDidChangeNotification 
// 电池状态改变
UIDeviceBatteryStateDidChangeNotification 
// 电池电量改变
UIDeviceBatteryLevelDidChangeNotification
// 近距离传感器(比如设备贴近了使用者的脸部) 
UIDeviceProximityStateDidChangeNotification 

四、键盘通知

1.特定的通知

// 键盘即将显示
UIKeyboardWillShowNotification 
// 键盘显示完毕
UIKeyboardDidShowNotification 
// 键盘即将隐藏
UIKeyboardWillHideNotification 
// 键盘隐藏完毕
UIKeyboardDidHideNotification 
// 键盘的位置尺寸即将发生改变
UIKeyboardWillChangeFrameNotification 
// 键盘的位置尺寸改变完毕
UIKeyboardDidChangeFrameNotification 

2.键盘通知的额外信息

// 键盘刚开始的frame
UIKeyboardFrameBeginUserInfoKey 
// 键盘最终的frame(动画执行完毕后)
UIKeyboardFrameEndUserInfoKey 
// 键盘动画的时间
UIKeyboardAnimationDurationUserInfoKey 
// 键盘动画的执行节奏(快慢)
UIKeyboardAnimationCurveUserInfoKey

补充:

通知和代理的选择

1.共同点:都能完成对象之间的通信
2.不同点:
* 代理:一对一的关系
* 通知:多对多的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。

5、通知和代理区别和使用

标签:delegate   通知   

原文地址:http://blog.csdn.net/wangbo_neuq/article/details/48081479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!