http://www.cocoachina.com/ios/20151214/14596.html

在了解控制器的生命周期之后,我们都知道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:等类似于这种会多次调用的系统方法中添加代码时,一定要多考虑业务逻辑,以免出现不必要的麻烦。

 
 

最新文章

  1. 《JavaScript高级程序设计》读书笔记 2
  2. 为什么要用elasticsearch-理解加深中
  3. Linux VMware 克隆后无法启动eth0网卡
  4. HTTPS原理
  5. select在各个浏览器中的兼容性问题
  6. 转: SQL Server索引的维护 - 索引碎片、填充因子
  7. Lamp 安装(CentOS6.6, php-5.4.39, httpd-2.4.12, mysql-5.6.24)
  8. Windows中检测当前是否有窗口全屏
  9. loadrunner中创建唯一随机数
  10. sql中 with rollup 、with cube、grouping 统计函数用法
  11. Linux 输入子系统
  12. win7 提升windows服务权限使非管理员用户可以控制windows服务的开启和关闭
  13. C++学习笔记3—对话框
  14. Xamarin For Visual Studio 3.0.54.0 完整离线破解版
  15. 永中DCS再添喜讯:顺利签约海信集团
  16. java abs(绝对值) , max(最大值),min(最小值) 方法的应用
  17. 封装的通过微信JS-SDK实现自定义分享到朋友圈或者朋友的ES6类!
  18. css-tips
  19. Spark SQL历险记
  20. 拿取页面值 跟拿取value里面的值

热门文章

  1. scp免密码拉去方法
  2. SQLSERVER 数据库管理员的专用连接DAC
  3. DVWA 之medium级别sql注入
  4. 2019-7-29-Roslyn-使用-Target-替换占位符方式生成-nuget-打包
  5. Vue设置element的dialog
  6. C++类中的枚举类型
  7. CENTOS 7更换系统启动默认内核
  8. 百度地图JavaScript API申请密钥注意要点
  9. TZ_06_SpringMVC_异常处理,自定义异常
  10. Markdown文档使用