ios调用dismissViewController的一个小陷阱
2016-02-25 20:27
501 查看
我们的APP从启动到进入主页面。是通过presentViewController构造了一个ViewController序列,类似于首页 -> 登陆页 -> 启动载入页 -> 主页面
当中。在启动载入页的viewDidAppear方法里做了非常多逻辑处理:
然后进入主页面之后,假设用户退出登陆,就须要回到首页,所以会在首页上调用dismissViewController方法。原先的代码类似这样:
预期的结果是。直接回到首页。然后触发首页的viewDidAppear方法。
实际上通过观察console warning才发现,中间启动载入页的viewDidAppear方法也被调用了。登陆页因为没有写viewDidAppear方法,所以没有发现,但我推測假设有的话,也一样会被调用。似乎ViewController是依照顺序一个接一个出栈的。所以每个“之前的”ViewController的viewDidAppear方法应该都会被触发
查了一下API,又上stackoverflow搜索了半天。似乎没有办法阻止这个默认行为。所以最后我的解决的方法是在中间的Controller上加了标记:
不知道大家有没有更好的做法
当中。在启动载入页的viewDidAppear方法里做了非常多逻辑处理:
-(void) viewDidAppear:(BOOL)animated{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ clientInfo = [YLSClientInfo new]; if([clientInfo needInit]){ [self mkdirAndDatabaseFile]; }else{ [self refreshVersion:[clientInfo currentVersion]]; } // 各种处理逻辑 }); }
然后进入主页面之后,假设用户退出登陆,就须要回到首页,所以会在首页上调用dismissViewController方法。原先的代码类似这样:
UIViewController *origin = self.presentingViewController.presentingViewController; if([origin isMemberOfClass:[YLSLoginViewController class]]){ origin = self.presentingViewController.presentingViewController.presentingViewController; } [origin dismissViewControllerAnimated:NO completion:nil];
预期的结果是。直接回到首页。然后触发首页的viewDidAppear方法。
实际上通过观察console warning才发现,中间启动载入页的viewDidAppear方法也被调用了。登陆页因为没有写viewDidAppear方法,所以没有发现,但我推測假设有的话,也一样会被调用。似乎ViewController是依照顺序一个接一个出栈的。所以每个“之前的”ViewController的viewDidAppear方法应该都会被触发
查了一下API,又上stackoverflow搜索了半天。似乎没有办法阻止这个默认行为。所以最后我的解决的方法是在中间的Controller上加了标记:
-(void) viewDidAppear:(BOOL)animated{ // 假设是因为调用了dismiss而触发了此方法,不进行初始化 if(self.isDismissing){ return; } // 初始化载入逻辑 }
YLSBootstrapViewController *bootstrapController = (YLSBootstrapViewController*)self.presentingViewController;
bootstrapController.isDismissing = YES;
UIViewController *origin = self.presentingViewController.presentingViewController; if([origin isMemberOfClass:[YLSLoginViewController class]]){ origin = self.presentingViewController.presentingViewController.presentingViewController; } [origin dismissViewControllerAnimated:NO completion:nil];
不知道大家有没有更好的做法
相关文章推荐
- iOS基础动画教程
- 程序人生 - 开源库
- iOS开发的22个技巧
- iOS学习笔记62- iOS开发小技巧之--WeakSelf宏的进化
- Memory Manager - 1
- iOS学习笔记61-AFNetworking造成的内存泄露处理
- iOS 从相机或相册获取图片并裁剪
- iOS数据持久化(-)属性文件
- iOS开发Runtime那些事
- iOS开发多线程---GCD的介绍和简单使用
- IOS开发之----NSDictionary,JSON和XML互相转换
- IOS学习 NSNavigationController 多个子页面间相互跳转
- iOS清除缓存
- IOS (null)以及<null>的区别
- iOS-AVCapture,自定义实现照相功能
- IOS 入门的总结
- ios 关于tableview小技巧
- ios controller的调用方法的周期
- IOS开发 ARC和非ARC下使用Block属性的问题
- nagios 网卡流量报警插件