键盘通知是通过 NSNotificationCenter通知中心 UIKeyboardWillShowNotification、 UIKeyboardDidShowNotification、UIKeyboardDidHideNotification、
UIKeyboardDidHideNotification 四种常用的通知实现的.
通知是一种消息机制,addObserver与removeObserver需要在对应的生命周期中成对出现。即有“添加”有“删除”。 在控制器的生命周期中,有四种注册、移除的方式,下面对着四种方式一一解读?.
1.1 在viewDidLoad 中addObserver 在 dealloc 中removeObserver
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)dealloc {
//移除键盘监听
}
这样会有什么问题呢? 当你的控制器注册了键盘通知 push 到 下一级界面的时候,你的键盘通知并没有被移除,如果第二级页面也注册了键盘通知 当发出通知时,上一级界面也会执行.
**1.2 在viewDidLoad 中addObserver 在 viewWillDisappear中removeObserver
- (void)viewDidLoad {
[super viewDidLoad];
// 注册键盘通知
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//移除键盘监听
}
这样会有什么问题呢? 随着iPhone手机屏幕越来越大,左上角的返回按钮早已够不到,很多APP通过侧滑的形式返回上一个界面, 当触发侧滑返回时会调用系统自带的viewWillDisappear:方法,要是这时候用户取消了侧滑返回(即回侧滑到一半又松手了), 这样在就收不到键盘通知了.
**1.3 在viewWillAppear 中addObserver 在 dealloc中removeObserver
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//注册键盘通知
}
- (void)dealloc {
//移除监听
}
这样造成的问题与第一种情况相同.
**1.4 在viewWillAppear 中addObserver 在 viewWillDisappear中removeObserver
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//注册键盘通知
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//移除键盘监听
}
这种方式就可以避免上述的所有问题 这也是Apple官方推荐的方式
二、 说完了 注册 移除的位置 我们就要讨论注册和移除的实现了 注册没什么可说的 但移除有两种被使用的方式
1. //移除键盘监听 直接按照通知名字去移除键盘通知, 这是正确方式
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
2. // 我们下面主要说说为什么不能够用
[[NSNotificationCenter defaultCenter] removeObserver:self];
如果你有兴趣 你可以做一个实验 在一个控制器A内添加一个通知 不写移除方法 当这个控制器A被销毁后 你在向这个控制器A发送通知 你会发现程序并没有奔溃 原因就是在控制器被销毁时 控制器走了一遍removeObserver:self的方法 (结果来自 给NSNotificationCenter写个类目 重写removeObserver方法) 移除了控制器的所有通知 由此可见,在你不是销毁的时候,千万不要直接调用[[NSNotificationCenter defaultCenter] removeObserver:self]; 这个方法,因为你有可能移除了系统注册的通知。
总结
在界面即将出现的时候注册键盘通知 在页面即将消失的时候移除通知 移除通知要用通知名对应去移除 通知平常使用的知识点差不多就这么多。希望对大家有帮助。良好的代码习惯对你至关重要。良好的代码习惯对你至关重要.