5、通知和代理区别和使用
来源:互联网 发布:懒角落 淘宝 编辑:程序博客网 时间:2024/04/29 08:17
一、代理Delegate
1.使用的场合
主要用于子控件发生某些动作时,通知父控件,子控件的代理是父控件。常见就控制器就是子控件的的代理。
2.代理的使用步骤
1> 先搞清除谁是谁的代理2> 定义代理协议,协议名称的规范是:控件类名+Delegate3> 定义代理方法 *代理方法一般都定义@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.键盘通知的额外信息
// 键盘刚开始的frameUIKeyboardFrameBeginUserInfoKey // 键盘最终的frame(动画执行完毕后)UIKeyboardFrameEndUserInfoKey // 键盘动画的时间UIKeyboardAnimationDurationUserInfoKey // 键盘动画的执行节奏(快慢)UIKeyboardAnimationCurveUserInfoKey
补充:
通知和代理的选择
1.共同点:都能完成对象之间的通信2.不同点:* 代理:一对一的关系* 通知:多对多的关系
0 0
- 5、通知和代理区别和使用
- 通知和代理有什么区别?
- iOS中通知和代理的区别
- 关于代理、通知和KVO区别
- 通知和kvo以及代理的区别
- 闭包, 代理和通知的区别?
- block和代理,通知的区别
- 通知中心和代理
- 代理 kvo和通知
- 通知和代理
- 代理 通知 和block
- ios 通知Notification和代理delete的区别
- 代理丶通知丶KVO之间区别和各自优势
- ios 代理、block和通知
- iOS 代理,通知和KVO的基本使用
- iOS中代理和通知的选择
- OC中代理和通知的概念
- iOS开发 kvc kvo 委托代理 协议 通知 简述 和使用场景
- Binary Tree Paths
- 1010 -- 青蛙的约会
- 1032. Sharing (25)
- 4、iOS 开发之 UITableView
- Add Digits
- 5、通知和代理区别和使用
- 6、iOS 开发之 UIPickerView
- 1067. Sort with Swap(0,*) (25)
- 1011 -- RLE解码
- 7、iOS 开发之程序启动原理
- 1012 -- 机器指令
- 8、iOS 开发之多控制器管理
- 1013 -- 分糖果
- 1014 -- 哥德巴赫猜想