(一)代理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.不同点:
*代理:一对一的关系
*通知:多对多的关系
网友评论