都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用.

这看上去没什么问题,键盘的显示和隐藏也都能监听到.可是稍微细心下就会发现,苹果在iOS7中增加了导航控制器侧滑返回功能,现在绝大多数App都使用了这项功能(有些App重写了自带的返回键之后忘记开启左滑返回手势了)。那么这项功能会带来什么问题呢?

问题就是:

当触发侧滑返回时会调用系统自带的viewWillDisappear:方法,在该方法中将监听键盘显示和隐藏的通知移除后,要是这时候用户取消了侧滑返回(即回到了原始状态),那么再点击界面上的textField唤出键盘,是不会发送键盘显示和隐藏的通知了,因为通知已被移除。。。

解决方案

1、将注册监听键盘显示和隐藏的代码放到viewWillAppear:方法中

因为在触发侧滑返回后又取消侧滑,则会调用viewWillAppear:方法。那么如果侧滑返回将通知移除,则在取消侧滑时又会将通知重新添加进去。

2、将移除通知的代码放到dealloc方法中

dealloc方法是在控制器销毁之时调用的。这个时候移除通知而不是在viewWillDisappear:方法中移除可以有效避免上述的问题。既然控制器都销毁了,那么还留着相关的通知干嘛?该移除的移除。

上面给出了两种解决方案,要说哪种最优,那肯定非第二种莫属了。

我在这里可以举个例子。假如我们现在有这么个场景:在控制器的view上有个label,在label上添加一个手势(一般手势都是在创建完label之后添加的),假设我在viewWillDisappear:方法中移除该手势,则此时用户侧滑返回之时又取消侧滑返回,那么原先在label上的手势却再也添加不回来了(这里label一般在viewDidLoad方法中创建),因为viewDidLoad方法不会再次调用。而第二种方法却可以有效避免这种情况,这样就可以避免我这种“手贱”的任意捣鼓了,是不是很完美呢?

总结如下:

1、iOS7新增加了导航控制器侧滑手势,当触发侧滑返回时,会调用系统的viewWillDisappear:方法,取消侧滑返回时又会调用viewWillAppear:方法。

2、在做手势和通知等一系列操作之时尽量在dealloc方法中执行,添加通知尽量在viewDidLoad等一次性方法中执行。

3、在viewWillAppear:、viewWillDisappear:、viewDidAppear:、viewDidDisappear:等类似于这种会多次调用的系统方法中添加代码时,一定要多考虑业务逻辑,以免出现不必要的麻烦。

转载于:https://www.cnblogs.com/pengsi/p/5568949.html

不要在viewWillDisappear:方法中移除通知相关推荐

  1. 尽量不要在viewWillDisappear:方法中移除通知

    本文转自CocoaChina 在了解控制器的生命周期之后,我们都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的v ...

  2. python不变的数据结构是_Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法...

    本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法.分享给大家供大家参考,具体如下: 问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可 ...

  3. list中移除元素:用remove(i)方法遇到的坑以及替代方法

    代码如下: for (int i = 0; i < organDtos.size(); i++) {if(organDtos.get(i)!=null && organDtos. ...

  4. 从Java字符串中移除Emojis字符的多种方法

    原文  https://www.baeldung.com/java-string-remove-emojis 1.简介 近日Emojis在文本消息里开始流行,有时候需要将其从普通字符串中移除掉.本文将 ...

  5. 在 Linux 中移除从源代码安装的程序的一种简单的方法

    不是所有的程序都可以在官方或者第三方库中找到,因此你不能使用常规的包管理来安装它们.有时你不得不从源代码中手动构建这些程序.就如你已经知道的一样,当你从源代码中安装一个程序的时候,这个软件包所包含的文 ...

  6. Quartus 工程中移除signaltap的方法

    Quartus 工程中移除signaltap的方法 问题描述:观察完信号之后,不想以后的quartus工程继续每次全编译都编译signaltap,加快编译时间 办法:在quartus的project ...

  7. Java中的等待/通知机制(wait/notify)

    为什么80%的码农都做不了架构师?>>>    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...

  8. Android 在onCreate()方法中获取控件宽高值为0解决方案

    大家很多时候需要在Activity或者Fragment的onCreate()方法中获取声明的空间的高度或者宽度,进行位置移动或者其他操作,但是当调用 view.getHeight() 或者 view. ...

  9. Android官方开发文档Training系列课程中文版:通知用户之更新或移除通知

    原文地址:http://android.xsoftlab.net/training/notify-user/managing.html#Removing 当需要在不同时段发布同一事件类型的通知时,应当 ...

最新文章

  1. ITK VTK CTK QT 跨平台联合开发之 一
  2. LINUX下SYN***战
  3. CAN总线(1)--初探(更新中)
  4. 您不会相信Buzzfeed如何处理变更管理
  5. request.getParameter() 和request.getAttribute() 区别
  6. 20200703:将有序数组转换为二叉搜索树(leetcode108)
  7. SiamRPN代码讲解,推理测试讲解
  8. 《史蒂夫·乔布斯传》——童年篇有感
  9. 银行数字化转型导师坚鹏:《银行业同业竞争策略分析》
  10. kafka数据同步Elasticsearch深入详解
  11. 建站的原型图是什么意思?
  12. Centos安装firefox
  13. 环信 php后台集成,集成环信IM功能
  14. 2020-09-24
  15. Qt win7中读取Excel会出现闪退的问题
  16. 一个通信专业的学习为了完成老师布置,学习Adobe Premiere Pro——PR新建工程以及PR的导入导出
  17. 硬核| 实例|货架设计利器|有限元法
  18. 诺基亚S60手机证书破解!(转载)
  19. ps字体下载素材网址
  20. 字节字双字地址的区别

热门文章

  1. 【机器视觉】 dev_unmap_prog算子
  2. 【机器视觉】 dev_map_par算子
  3. 【机器视觉】 dev_get_exception_data算子
  4. 【机器视觉】 until算子
  5. 【Qt】Qt登录对话框(设计器实现)
  6. openmv串口数据 串口助手_Qt小项目之串口助手控制LED
  7. 渲染好的页面怎么转为图片_图片导成PDF后页面大小不同怎么办
  8. Codeforces 987C. Three displays(o(n^2))
  9. 控制台怎么退出mysql_退出mysql控制台与退出mysql
  10. Android编译错误: The project cannot be built until build path errors are resolved