UINavgation日常小bug-有兴趣的朋友可以看看
UINavgation日常
UINavgation
- 今天在做一个小Demo,发现一个Bug,挺有意思的,就是在你不断调用Navigation
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;方法的时候,发现在不断点击一个按钮来调用这个方法,在点击返回调用- (UIViewController *)popViewControllerAnimated:(BOOL)animated;这个方法,这是在快速多次点击返回不但没有返回,还多次向Navigition里面添加控制器。
额,黑苹果录制有点缺陷,自行脑补画面吧。
这是什么问题呢,代码不多,可以看看,那么问题究竟出在哪里呢?
//push
//触发点击事件
[btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; //接收按钮点击处理
- (void)btnClick:(UIButton *)btn{
[self.navigationController pushViewController:[[ETRecommendController alloc] init] animated:YES];
} //pop
//触发点击时间
[backBtn addTarget:self action:@selector(pop)
//接受点击事件
- (void)pop{
[self popViewControllerAnimated:YES];
}
看看现在的分析
- 我想点击push就调用push方法,返回就调用pop,并且只调用一次。
- 现在点击push的确是显示一次,点击pop的时候,明显的看到添加了好多子控制器进去,而实际上也的确添加了好多自控器(实际的确如此)
- 这里我是自定义Navigation的,那么可能是我自定义里面的代码里面写逻辑不对,与系统的冲突,于是换了系统的Navigation,然而结果一样。
- 不得不说一个细节是在按钮的两端点才回出现这个bug,在中间点则一切正常。
于是乎我发现在接受按钮push点击事件的方法调用多次,但是明明看到我还没返回根控制器啊,同时也看到我点击的返回按钮啊,突然间我发现我是这样调用push方法的
[self.navigationController pushViewController:[[ETRecommendController alloc] init] animated:YES];注意后面的animated:YESNavigation的跳转带动画效果,而这个动画效果是通过CoreAnimation的专场动画来实现的,而动画的需要时间,而在RunLoop里面的NSDispalyLink与NStimer那么如果在一定时间内没有执行完任务会自动跳过,而现在会不会类似这样呢,毕竟是都是基于线程运行的,而线程的架构模式又是RunLoop,亦即是说执行动画需要时间,在这个时间里面没有执行完动画,那么RunLoop直接处理下一个Source。额...,如果是这样的话,那么直接把动画设为NO就行了吧,于是把YES换成NO,的确,一点问题也没有,问题这样似乎是解决了,请留意我上面说的一个细节。
在按钮的两端点才回出现这个bug,在中间点则一切正常
如果说在两端和中间点击的效果一样的话,这样动画的YES和NO就很有说服力了,但是现在明显不是。
于是乎现在又是这样一个状况
在我们点击过去的时候,push键(非返回键)动画效果的时候,变成了这样一个局势:中间的一个模块不能接收相应,而周围可以,也就是说,中间和周围不是同一块控件,毕竟根据响应者链条,寻找最合适的View,所以,如果能接收事件那他一定是同一块View,除非他不遵循响应者链条,而现在就是这个局势,一个控件居然不遵循响应者链条,好吧,这个猜想有点大胆,理由也比较勉强。
这里需要普及一下苹果的一些细节的知识,在我们点击iPhone键盘的时候,例如我点击了g,那么苹果会从他系统自带的猜词字典里面猜想我们下一个会按什么,这是可能是good,也可能是god,但是可以肯定的是o的触控范围一定比某一些字母的触控范围大,也就是说虽然我们看起来键盘一直没有变化,他的每个字母能接收事件的范围永远都在动态变化的,这也是苹果用户体验比较好的一个细节。
行了,有了上面的小提示,你应该想到我接下来要讲什么了吧,就是我们的返回按钮的接收事件的范围会被放大,当然这只是我的一个猜想,那么如果我的猜想成功的话,现在就是这个局势,中间一个push键的确push后不能点击,但是他的响应范围被放大了,所以就形成了中间点击正常,边框点击会调用push方法,这样猜想貌似合理,这种猜想与上面的那种猜想结合起来应该会比较合理,但是毕竟是猜想。
至于解决方案,很简单,我猜你也想到了,不过为什么会出现这个bug,这才是最重要的,至少求学态度没有错,解决方案:大体是:
- 如果是自定义Navigation的话,可以在重写的push方法里面检查navigation里面是否已经存在了这个控制器。
- (BOOL)checkIsExit:(id)VC{
for (id classObj in self.childViewControllers) {
Class class = [classObj class];
if ([VC isKindOfClass:class]) {
return YES;
}
}
return NO;
}
- 如果是系统自带的话,可以在navigation的childrenControllers的count的变化的时候判断是否取出最后一个,这里可能会用到KVO,需要提醒的是,系统的KVO并不是对一切属性都可用的,如果是使用Swift的话推荐一个第三方框架
Observable-Swift,这个框架很好的利用了Swift的泛型,如果的OC,自行到github上寻找框架。
- 如果是系统自带的话,可以在navigation的childrenControllers的count的变化的时候判断是否取出最后一个,这里可能会用到KVO,需要提醒的是,系统的KVO并不是对一切属性都可用的,如果是使用Swift的话推荐一个第三方框架
UINavgation日常小bug-有兴趣的朋友可以看看的更多相关文章
- 观CSDN站点小Bug有感
今天早上在浏览博客的时候偶然发现CSDN博客的数据出现了异常,我也是头一次看到这么明显的Bug.详细什么表现呢?先来看个截图.例如以下: 常常看CSDN博客的人 ...
- 小BUG大原理:重写WebMvcConfigurationSupport后SpringBoot自动配置失效
一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小 BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小 BUG 我了解到不少 ...
- 小BUG大原理 | 第一篇:重写WebMvcConfigurationSupport后SpringBoot自动配置失效
一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小BUG我了解到不少未知的 ...
- (原创)WinForm中莫名其妙的小BUG——ComboBox 尺寸高度问题
一.前言 使用WinForm很久了,多多少少遇到一些小BUG. 这些小BUG影响并不严重,而且只要稍微设置一下就能正常使用,所以微软也一直没有修复这些小BUG. 本来并不足以写篇文章去记录,但是昨天遇 ...
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- 解决JqueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug
前些日子不是在做 使用Jquery-UI实现一次拖拽多个选中的元素操作嘛,在持续完善这个组件时遇到了一个关于拖放排序的bug.今天就着图片和代码重现一下,也顺便告诉大家如何解决这个问题. 首先先上图描 ...
- 淘宝WAP版小BUG分析
前几天发现的一个淘宝WAP版的小BUG,就是用桌面版chrome看的时候产品评价中的图片显示不出来,都是图裂了. 这是什么原因呢?图片为什么会显示不出来呢?淘宝的技术人员.测试人员不可能没发现啊.开启 ...
- hihocoder 1347 小h的树上的朋友
传送门 时间限制:18000ms单点时限:2000ms内存限制:512MB 描述 小h拥有$n$位朋友.每位朋友拥有一个数值$V_i$代表他与小h的亲密度.亲密度有可能发生变化.岁月流逝,小h的朋友们 ...
- 关于一个小bug的修正
python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...
随机推荐
- Eclipse中查看Android模拟器SD卡目录
· 有时候用到Android模拟器来模拟SD卡相关操作,在Eclipse中可以直接查看SD卡目录: 首先,新建模拟器的时候要创建SD卡,存储的大小根据需要创建: 启动模拟器,在Eclipse中打开视图 ...
- Android studio中不同颜色代表什么意思
和你的版本控制工具相关 绿色,已经加入控制暂未提交红色,未加入版本控制蓝色,加入,已提交,有改动白色,加入,已提交,无改动
- dom解析器机制 web基本概念 tomcat
0 作业[cn.itcast.xml.sax.Demo2] 1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- 1106. Two Teams(dfs 染色)
1106 结点染色 当前结点染为黑 朋友染为白 依次染下去 这题是为二分图打基础吧 #include <iostream> #include<cstdio> #include ...
- poj 2524 Ubiquitous Religions (并查集)
题目:http://poj.org/problem?id=2524 题意:问一个大学里学生的宗教,通过问一个学生可以知道另一个学生是不是跟他信仰同样的宗教.问学校里最多可能有多少个宗教. 也就是给定一 ...
- mac osx 升级yosemite后java出错的解决
原文 http://www.cnblogs.com/walkerwang/p/4034152.html
- 【转】Android开发20——单个监听器监听多个按钮点击事件
原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...
- table中tr使用toggle不好,选择换一张方式
好几次遇到的问题,都是table中tr后面有一部分内容要显示,也是用tr装的,但是需要点击该行,后面那个tr才显示出来.不过最好不要用toggle去写,因为着实效果不佳.故而建议换一种方式,也许最简单 ...
- (四)学习MVC之修改个人资料和身份验证登陆
1.修改资料不用建立模型,直接在UserControl.cs添加 ChangeInfo(): #region 修改用户资料 [UserAuthorize] public ActionResult Ch ...