本文转自CocoaChina

在了解控制器的生命周期之后,我们都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用。很多时候我们根据自身需要将相关代码逻辑添加到这两个方法中,我们看下如下代码片段:

监听键盘的通知代码

这段代码是在控制器的viewDidLoad:方法中注册了一个键盘弹出的通知和键盘隐藏的通知,然后在调用到相关方法时分别在控制台打印,在viewWillDisappear:界面即将隐藏的时候移除通知,具体效果如下图:

代码运行效果图

这看上去没什么问题,键盘的显示和隐藏也都能监听到。尼玛!被骗了!?

其实并不然,细心的开发人员会知道,苹果在iOS7中增加了导航控制器侧滑返回功能,现在绝大多数App都使用了这项功能(有些App重写了自带的返回键之后忘记开启左滑返回手势了)。那么这项功能会带来什么问题呢?我们接着看下面的操作:

侧滑效果图

随着iPhone手机屏幕越来越大,左上角的返回按钮早已够不到(原谅我手小= =!),很多“手贱”的人喜欢通过这种侧滑的形式返回上一个界面(其实说的是我。。。),而这种侧滑返回会出现什么问题呢?当触发侧滑返回时会调用系统自带的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/emmet7life/p/5047595.html

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

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

    都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用. 这看上去没什么问题,键盘的显示和隐 ...

  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. 数据库分析与设计练习题(二)基础知识、在IDEF0需求建模方法中,下列关于描述功能活动的图示,正确的是、事务详细编码设计是在下列哪个阶段完成的、下列关于从属实体集的描述,错误的是、各事务尽量按照相同的

    17.在数据库系统生命周期中,通过系统规划与定义来明确系统的目标任务.下列不属于系统规划与定义内容的是 A确定成本预算 B确定任务目标 C确定用户视图 D确定系统边界 参考答案为A 解析:系统规划与定 ...

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

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

  8. 从String中移除空白字符的多种方式!?差别竟然这么大!

    字符串,是Java中最常用的一个数据类型了.我们在日常开发时候会经常使用字符串做很多的操作.比如字符串的拼接.截断.替换等. 这一篇文章,我们介绍一个比较常见又容易被忽略的一个操作,那就是移除字符串中 ...

  9. java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...

    从List中移除指定 List 中包含的其所有元素,这个当然用List里面的removeAll方法了,但是有朋友说能不能不用removeAll呀 于是我就写了如下代码: class="jav ...

最新文章

  1. ASP.NET Get和Post两种提交的区别
  2. ITK:将矢量图像投射为另一种类型
  3. 职高中专的模块化课程设计难点
  4. java_poi教程.pdf,如何使用POI转换.DOC / .DOCX为PDF在Java ..?
  5. 我的世界java雪村种子_我的世界:5个珍藏级开局种子,第4个大家都在找,最后1个最富有...
  6. HTML页面跳转及传递参数
  7. qt web混合编程_Qt+VS混合编程教程
  8. veeam安装和部署_Veeam Backup Replication 8 安装配置
  9. 文档大小超出上传限制怎么办_有道翻译和翻译狗,哪个更适合翻译文档?
  10. 使用tornado的异步非阻塞
  11. Javascript 面向对象编程(一):封装
  12. 课堂派作业第一题(附思路)已改完!
  13. linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
  14. Axure 设计App界面
  15. 2021年起重机司机(限桥式起重机)复审考试及起重机司机(限桥式起重机)证考试
  16. 导入Excel至数据库中 quot;外部表不是预期格式quot;错误信息
  17. 【Web接口测试_基础概念】接口概念、接口分类、接口定义、接口规范、接口方法、接口用例设计整理
  18. 2021-03-14 JavaWeb实验课
  19. 无约束优化和有约束优化原理
  20. 面试心得与总结---BAT、网易、蘑菇街【转载】

热门文章

  1. 【网络安全工程师面试合集】—CSRF跨站请求伪造 攻击及防御
  2. exchange邮箱服务器端追踪某用户发送的邮件(发送状态、时间、主题等等信息)
  3. python环境配置(二)——centos6+ 安装python3.6以及pip3
  4. 阿里天池_优秀策略答辩PPT和相关博客
  5. 嵌入式软件开发工程师的养成之路——从 推挽输出 开始
  6. linux孟庆昌第六章课后题_第六章 参数估计-矩估计:通过课后题理解矩估计
  7. 配置tomcat tomcat与nginx的整合
  8. Markdown中插入图片及图注
  9. ~~单链表(数据结构)
  10. 计算机视觉CV中的论文写作英语(by Youki)