iOS开发笔记之十九——一个模态视图切换bug引发的思考
来源:互联网 发布:翼龙贷java 待遇 编辑:程序博客网 时间:2024/05/23 01:56
1、开发场景
最痛苦的不过是在别人留下的一堆代码中修复bug。最近工程项目需要修复一个困扰已久的bug,这个虽然是一个页面的闪过问题,不会影响功能,
只是看起来有点不舒服。最早开发的前辈们都已经不在了,但是如果修改它,就会牵一发而动全身,需要修改的东西太多了。要知道,没有人敢轻易
去动原有已经成熟稳定的东西。这个由于模态视图切换引起的bug,我最近狠了心,决定去修复它。
问题大致是这样子的:
2、以下是前辈们留下的代码逻辑:
有个管理的主界面。有众多的入口要进入这个界面,当然进入这个界面之前需要先调用管理主界面的checkLogin方法进行登录判断,如果已经登录则
直接push进入主界面。否则,仍需要push主界面,再视图模态切换到登录界面,待登录成功以后,信息回传将登录试图模态“踢出”直接显示主界面。
入口处代码如下:
ManagerViewController * t = [[ClassFactory instance]createSingletonController:@"ManagerViewController" param:nil]; [[AppController instance] pushController:t]; [t checkLogin];
3、于是问题来了:
当你未登录进入管理主界面时,会先出现没有任何信息的管理主界面再进入登录界面,这个过程中间会出现“闪过”管理界面的现象,
这不会影响到功能,但是作为对用户体验要求很高的移动产品来说,很明显这是一个很糟糕的设计。
4、可能会有人疑问:
为何不在主界面入口的controller界面进行判断呢?我也有过这样的疑问,后来研究发现,前辈们把checkLogin方法写在管理主界面的controller里面也是有一定道理的。
毕竟入口有可能会很多,在很多处进行checkLogin判断,很明显这也不是很好的设计。
5、我的修改方案
修改方案一:
当初发现这个问题是,第一反应就是用performSelector:方法来解决。原来的代码逻辑几乎不动,直接将push主界面实例这一操作,延迟执行不就行了吗。不得不承认,
我很喜欢用performSelector:这个方法,因为它在解决这种push界面的顺序问题,很好使。 但是它在我们这个偌大的工程中使用,有个很要命的缺点,就是会经常执行后
卡死界面。没办法,尽管好使,不得不丢弃这个方案。代码如下:
修改方案二:
修改这种问题有个潜规则,就是尽可能小的改动源代码,不然你可能带来很多其它潜在的bug。我的修复方案是这样子的:在入口controller界面要进入管理主界面时,
(1) 实例化管理主界面类,调用checkLogin方法,如果已经登录,直接push管理主界面的实例;
(2) 实例化管理主界面类,调用checkLogin方法,如果未登录,模态切换到登录试图进行登录,并将管理主界面controller实例传给登录界面,待登录成功后,再将管理主界面实例push入栈;
大致的代码实现如下:
入口处代码如下:
ManagerViewController * t = [[ClassFactory instance]createSingletonController:@"ManagerViewController" param:nil]; if (![t checkLogin]) { [[AppController instance] pushController:t]; }
登录controller里面:
if (isLogin) { /* 登录成功后,先将tManagerViewController压入堆栈,为主界面显示做准备; [[AppController instance] pushController:self.tManagerViewController]; ..... }
checkLogin方法大致如下:
- (bool)checkLogin{ if (....) { LoginViewController * wLoginController = [[LoginViewController alloc] init]; wLoginController.tManagerViewController = self; .... return true; } return false;}
6、此修改引入的bug
尽管这个修改很保守,但是仍旧被测试测出了很多bug,原因很简单,修改引入了很多其他问题,下面举典型的如下:
(1) 管理主界面有个自动登出的功能,就是过了大约5分钟后,管理界面会自动退出。原来的自动退出里面只是切换到了登录界面,没有将管理界面pop出来。这样的话,如果自动登出后,再次登录进入管理主界面,栈里会有两个管理主界面的ManagerViewController了,此时主界面会”卡死“;按照方案二修改后,退出操作里面需要再次将管理主界面pop出来。
7、参考资料
《iOS开发指南》——关东升
- iOS开发笔记之十九——一个模态视图切换bug引发的思考
- 一个iOS bug引发的思考
- 一个BUG引发的思考
- iOS开发笔记之二十九——一个关于工程目录读写权限的问题
- 一个bug引发的哲学思考
- iOS开发笔记之四十一——一个野指针引起的bug
- iOS开发笔记之四十二——一个double精度导致的bug
- Spring之LoadTimeWeaver——一个需求引发的思考
- Spring之LoadTimeWeaver——一个需求引发的思考
- iOS开发笔记之二十三——一个delegate没有更新引起的bug(bug总结三)
- iOS开发笔记之六十三——一个NSTimer引发内存泄漏
- iOS开发笔记之六——视图的生命周期
- iOS开发笔记之四十三——日历NSCaledar使用过程中遇到的一个苹果系统bug
- 一个 Bug 引发的思考(超赞的文章)
- 表单提交后分页页面标签POST实现 —— 一个小小的bug引发的思考
- iOS开发笔记--视图切换的动画效果
- iOS开发笔记--视图切换的动画效果
- iOS学习之——视图切换
- 贝塞尔曲线生成算法
- 育儿好书推荐
- 【C#】窗体控件随窗体大小改变(包括字体大小)
- 修改android4.0系统的设置的小标题栏
- Python中使用POST方式上传文件
- iOS开发笔记之十九——一个模态视图切换bug引发的思考
- HDU 2940 Hex Factorial(高精度,打表)
- dup , dup2的剖析
- SDUTOJ 2093 Fermat’s Chirstmas Theorem 素数筛
- flex强制类型转换
- [分享]云主机,虚拟机,VPS该注意哪些优化呢?
- 删除恢复Hadoop集群中的DataNode
- 通过PowerShell获取Windows系统密码Hash
- AutoLayout学习常见问题