都知道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:等类似于这种会多次调用的系统方法中添加代码时,一定要多考虑业务逻辑,以免出现不必要的麻烦。

 
 

不要在viewWillDisappear:方法中移除通知的更多相关文章

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

    http://www.cocoachina.com/ios/20151214/14596.html 在了解控制器的生命周期之后,我们都知道viewWillAppear:方法是在控制器的view将要显示 ...

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

    1.iOS7新增加了导航控制器侧滑手势,当触发侧滑返回时,会调用系统的viewWillDisappear:方法,取消侧滑返回时又会调用viewWillAppear:方法.   2.在做手势和通知等一系 ...

  3. iOS NSNotificationCenter 移除通知带来的crash

    Where to remove observer for NSNotification? 在dealloc方法中移除通知观察者带来crash NSNotificationCenter中的通知消息已经发 ...

  4. 为什么不要在viewDidLoad方法中设置开始监听键盘通知

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一个普遍的错误是,程序猿(媛)试图在view controll ...

  5. iOS之创建通知、发送通知和移除通知的坑

    1.创建通知,最好在viewDidLoad的方法中创建 - (void)viewDidLoad { [super viewDidLoad]; //创建通知 [[NSNotificationCenter ...

  6. 【转载】C#中string类使用Remove方法来移除指定位置的字符

    在C#的字符串操作过程中,有时候需要将字符串中指定位置的字符移除,此时就可能使用到字符串类string类中的Remove方法,此方法允许指定移除开始的开始的索引位置,以及移除的长度信息等,共有2个重载 ...

  7. IOS开发中如何使用通知NSNotification传值

    通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便.便捷,一个简单的Demo实现通知的跳转传值. 输入所要发送的信息 ,同时将label的值通过button方法调用传递, - (IB ...

  8. Dubbo中订阅和通知解析

    Dubbo中关于服务的订阅和通知主要发生在服务提供方暴露服务的过程和服务消费方初始化时候引用服务的过程中. 2345678910111213141516171819 public <T> ...

  9. 国内物联网平台(8):中移物联网开放平台OneNet

    国内物联网平台(8)——中移物联网开放平台OneNet 马智 平台定位 OneNET是中移物联网有限公司搭建的开放.共赢设备云平台,为各种跨平台物联网应用.行业解决方案,提供简便的云端接入.存储.计算 ...

随机推荐

  1. 说一下 runnable 和 callable 有什么区别?(未完成)

    说一下 runnable 和 callable 有什么区别?(未完成)

  2. Paper Reading:推荐系统评价指标综述

    论文:推荐系统评价指标综述 发表时间:2012 发表作者:朱郁筱,吕琳媛 论文链接:论文链接 本文对现有的推荐系统评价指标进行了系统的回顾,总结了推荐系统评价指标的最新研究进展,从准确度. 多样性.新 ...

  3. 聊聊我理解的ANSI C、ISO C、GNU C、POSIX C

    几句话了解C标准之间的关系 C语言标准 早期的计算机汇编语言是与机器平台紧密耦合的,为了屏蔽这种耦合,增加代码的可移植性,C语言随机出现. 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异, ...

  4. IE版本判断条件注释

    IE下判断IE版本的语句...[if lte IE 8]……[endif]  <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见   < ...

  5. [Javascript] Nested generators

    To see how to call another generator inside a generator: function* numbers () { ; ; yield* moreNumbe ...

  6. 002_UCOSIII任务创建于删除

    (一)先创建一个启动任务来进行创建其它任务,创建任务的宏定义 #define START_TASK_PRIO 3 //任务优先级 #define START_STK_SIZE 128 //任务堆栈大小 ...

  7. 052_获取本机 MAC 地址

    #!/bin/baship a s | awk 'BEGIN{print "本机 MAC 地址信息如下:"}/^[0-9]/{print $2;getline;if($0~/lin ...

  8. 五十六. playbook基础 、 playbook进阶

    1.playbook练习 安装Apache并修改监听端口为8080 修改ServerName配置,执行apachectl -t命令不报错 设置默认主页hello world 启动服务并设开机自启   ...

  9. 参数类型 (@Test层)常用参数

    long lNum = 1234L; float fNum = 1.23f; double dNum = 1.23d;

  10. windows下注册表脚本编写

    Reg文件就是我今天所说的注册表脚本文件,双击可将其中的数据写入注册表.利用注册表脚本文件可以对注册表进行关于键值的任何操作,而且还不受注册表被禁用的限制.     我们平常对注册表的修改大体上可以分 ...