一.系统消息
1.最近项目中发现通知使用不当,会导致通知回调不是一一对应,有时候会回调两次,导致绑定监听的方法会多次调用(我们程序就页面回退了多次,因为我们绑定的是页面回退的方法)
原因:就是通知注册和移除不对应导致。
2.如果你的页面是 UIView,那很简单可以直接有下面一个函数就搞定
#pragma mark - keyboard
- (void)willMoveToWindow:(UIWindow *)newWindow //(willMoveToWindow为 UIView接口)注册键盘相关通知
{
if (newWindow) {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object: nil];
}
else
{
[[NSNotificationCenter defaultCenter] removeObserver: self];//移除
}
}
或者(以下是我们自己封装的接口,就是页面显示完成,页面消失完成两个接口)
- (void)componentDidDisplay
{
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
}
- (void)componentDidDisappear
{
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
3.如果你的页面是 UIViewController
有两方法 推荐用第一种
//法1(页面将要显示的时候添加,页面将要消失的时候移出)
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver: self];
}
法2 (页面创建的时候添加 viewDidLoad, 页面销毁的时候移出 dealloc)
不推荐的原因是 ARC模式下(MRC一样)如果block循环引用或计时器之类的使用不当,会导致dealloc不调用,也就导致通知不对应
//页面创建的时候添加 viewDidLoad, 页面销毁的时候移出 dealloc
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
}
2017年1月5日
二.自定义消息
以上页面由于发送的是系统通知UIKeyboardWillShowNotification,不需要调用postNotificationName
1.自定义消息除了正确参考系统消息写法外,还要自己发通知
公共宏页面
#define kRrefreshPasswordNotification @"huRefershPassword"
A页面//发通知
[[NSNotificationCenter defaultCenter] postNotificationName:kRrefreshPasswordNotification object:nil];
B页面//注册消息和方法--初始化时候写 (参照系统消息写法)
[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(refreshData:) name: kRrefreshPasswordNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver: self];
-(void)refreshData:(NSNotification*)notification
{
NSDictionary *param = [notification object];//通过这个获取到传递的对象
[self _unlockSubmitButton];
[self reloadBankAndMoney];
}
(void)addNotifictionListener
{
[kNotificationCenter addObserver:self selector:@selector(receiveSocketData:) name:kRefreshPushCourceNotification object:nil];
}(void)removeNotificationListener
{
[kNotificationCenter removeObserver: self];
}
如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。