尽量不要在viewWillDisappear:方法中移除通知
本文转自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:方法中移除通知相关推荐
- 不要在viewWillDisappear:方法中移除通知
都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用. 这看上去没什么问题,键盘的显示和隐 ...
- python不变的数据结构是_Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法...
本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法.分享给大家供大家参考,具体如下: 问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可 ...
- list中移除元素:用remove(i)方法遇到的坑以及替代方法
代码如下: for (int i = 0; i < organDtos.size(); i++) {if(organDtos.get(i)!=null && organDtos. ...
- 从Java字符串中移除Emojis字符的多种方法
原文 https://www.baeldung.com/java-string-remove-emojis 1.简介 近日Emojis在文本消息里开始流行,有时候需要将其从普通字符串中移除掉.本文将 ...
- 在 Linux 中移除从源代码安装的程序的一种简单的方法
不是所有的程序都可以在官方或者第三方库中找到,因此你不能使用常规的包管理来安装它们.有时你不得不从源代码中手动构建这些程序.就如你已经知道的一样,当你从源代码中安装一个程序的时候,这个软件包所包含的文 ...
- 数据库分析与设计练习题(二)基础知识、在IDEF0需求建模方法中,下列关于描述功能活动的图示,正确的是、事务详细编码设计是在下列哪个阶段完成的、下列关于从属实体集的描述,错误的是、各事务尽量按照相同的
17.在数据库系统生命周期中,通过系统规划与定义来明确系统的目标任务.下列不属于系统规划与定义内容的是 A确定成本预算 B确定任务目标 C确定用户视图 D确定系统边界 参考答案为A 解析:系统规划与定 ...
- Quartus 工程中移除signaltap的方法
Quartus 工程中移除signaltap的方法 问题描述:观察完信号之后,不想以后的quartus工程继续每次全编译都编译signaltap,加快编译时间 办法:在quartus的project ...
- 从String中移除空白字符的多种方式!?差别竟然这么大!
字符串,是Java中最常用的一个数据类型了.我们在日常开发时候会经常使用字符串做很多的操作.比如字符串的拼接.截断.替换等. 这一篇文章,我们介绍一个比较常见又容易被忽略的一个操作,那就是移除字符串中 ...
- java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...
从List中移除指定 List 中包含的其所有元素,这个当然用List里面的removeAll方法了,但是有朋友说能不能不用removeAll呀 于是我就写了如下代码: class="jav ...
最新文章
- ASP.NET Get和Post两种提交的区别
- ITK:将矢量图像投射为另一种类型
- 职高中专的模块化课程设计难点
- java_poi教程.pdf,如何使用POI转换.DOC / .DOCX为PDF在Java ..?
- 我的世界java雪村种子_我的世界:5个珍藏级开局种子,第4个大家都在找,最后1个最富有...
- HTML页面跳转及传递参数
- qt web混合编程_Qt+VS混合编程教程
- veeam安装和部署_Veeam Backup Replication 8 安装配置
- 文档大小超出上传限制怎么办_有道翻译和翻译狗,哪个更适合翻译文档?
- 使用tornado的异步非阻塞
- Javascript 面向对象编程(一):封装
- 课堂派作业第一题(附思路)已改完!
- linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
- Axure 设计App界面
- 2021年起重机司机(限桥式起重机)复审考试及起重机司机(限桥式起重机)证考试
- 导入Excel至数据库中 quot;外部表不是预期格式quot;错误信息
- 【Web接口测试_基础概念】接口概念、接口分类、接口定义、接口规范、接口方法、接口用例设计整理
- 2021-03-14 JavaWeb实验课
- 无约束优化和有约束优化原理
- 面试心得与总结---BAT、网易、蘑菇街【转载】
热门文章
- 【网络安全工程师面试合集】—CSRF跨站请求伪造 攻击及防御
- exchange邮箱服务器端追踪某用户发送的邮件(发送状态、时间、主题等等信息)
- python环境配置(二)——centos6+ 安装python3.6以及pip3
- 阿里天池_优秀策略答辩PPT和相关博客
- 嵌入式软件开发工程师的养成之路——从 推挽输出 开始
- linux孟庆昌第六章课后题_第六章 参数估计-矩估计:通过课后题理解矩估计
- 配置tomcat tomcat与nginx的整合
- Markdown中插入图片及图注
- ~~单链表(数据结构)
- 计算机视觉CV中的论文写作英语(by Youki)