美文网首页IOS程序员iOS学习开发
iOS 键盘通知(NSNotificationCenter)正

iOS 键盘通知(NSNotificationCenter)正

作者: 清晨十分的阳光 | 来源:发表于2016-11-12 13:46 被阅读0次

    键盘通知是通过 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]; 这个方法,因为你有可能移除了系统注册的通知。

    总结
    在界面即将出现的时候注册键盘通知 在页面即将消失的时候移除通知 移除通知要用通知名对应去移除 通知平常使用的知识点差不多就这么多。希望对大家有帮助。良好的代码习惯对你至关重要。良好的代码习惯对你至关重要.

    相关文章

      网友评论

        本文标题: iOS 键盘通知(NSNotificationCenter)正

        本文链接:https://www.haomeiwen.com/subject/yzrqpttx.html