通知可以用来发送任意消息,甚至可以包含一个 userInfo 字典。你也可以继承 NSNotification 写一个自己的通知类来自定义行为。通知的独特之处在于,发送者和接收者不需要相互知道对方,所以通知可以被用来在不同的相隔很远的模块之间传递消息
。这就意味着这种消息传递是单向的,我们不能回复一个通知
有关NSNotification
通知类要知道有三个属性
@property (readonly, copy) NSString *name;//通知名称
@property (readonly, retain) id object;//通知的发送者
@property (readonly, copy) NSDictionary *userInfo;//通知内容
创建方式command +鼠标左键 点入头文件查看 很简单~
下面来看一下经常用的NSNotificationCenter
类 通知中心
//返回当前进程的默认通知中心可用于检测系统通知 例如键盘或设备旋转
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//向通知中心注册监听器:
//observer:通知监听者;
//aSelector:收到通知要执行的方法;
//aName:通知名称;
//anObject:通知发布者
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
举例说明~
1.监听系统键盘通知使view随键盘显示而上移
// 监听者是控制器 监听键盘的frame改变
[center addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
-(void)keyboardWillChangeFrame:(NSNotification*)noti;
// NSLog(@"%@",noti); 可以打印出 被监听者发生的行为
// (发出的消息)
CGFloat duration=[noti.userInfo[UIKeyboardAnimationDurationUserInfoKey]doubleValue];
CGRect transfrom=[noti.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];
CGFloat transfromY=transfrom.origin.y-self.view.frame.size.height;
[UIView animateWithDuration:duration animations:^{
self.view.transform=CGAffineTransformMakeTranslation(0, transfromY);
}];
//*********************只要创建了 就必须销毁 否则系统不稳定容易崩溃即使不崩溃 也不利于性能和内存
-(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
以下关于键盘干货 可在UIKit->UIWindow 中查找
键盘通知的名称:
UIKeyboardWillShowNotification // 键盘即将显示
UIKeyboardDidShowNotification // 键盘显示完毕
UIKeyboardWillHideNotification // 键盘即将隐藏
UIKeyboardDidHideNotification // 键盘隐藏完毕
UIKeyboardWillChangeFrameNotification // 键盘的位置尺寸即将发生改变
UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕
系统发出键盘通知时,会附带一下跟键盘有关的额外信息(字典),字典常见的key如下:
UIKeyboardFrameBeginUserInfoKey // 键盘刚开始的frame
UIKeyboardFrameEndUserInfoKey // 键盘最终的frame(动画执行完毕后)
UIKeyboardAnimationDurationUserInfoKey // 键盘动画的时间
UIKeyboardAnimationCurveUserInfoKey // 键盘动画的执行节奏(快慢)
2.自定义通知的使用
//自定义通知名称(可在.m文件中定义)
NSString *const ClickBtnNotification = @"ClickBtnNotification";
//(.h文件中引用)
UIKIT_EXTERN NSString * const ClickBtnNotification;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickBtn:) name:ClickBtnNotification object:nil];
-(void)clickBtn:(NSNotification *)noti
{ //当监听到按钮点击的通知时会进行调用
NSLog(@"点我了--- %@",noti);//打印通知内容
}
//在需要发送通知的控制器中点击按钮时发送通知
//object可用来指定通知发布者(这样可以在添加通知的时候指定谁发布的通知 来进行一一对应)
[[NSNotificationCenter defaultCenter] postNotificationName:ClickBtnNotification object:nil userInfo:@{@"1":@"1"}];
最后记得销毁所注册的监听器
注:注册通知进行传值时注意控制器上下级关系