博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios调用dismissViewController的一个小陷阱
阅读量:7114 次
发布时间:2019-06-28

本文共 1782 字,大约阅读时间需要 5 分钟。

我们的APP从启动到进入主页面。是通过presentViewController构造了一个ViewController序列,类似于首页 -> 登陆页 -> 启动载入页 -> 主页面

当中。在启动载入页的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];
不知道大家有没有更好的做法

转载地址:http://ceghl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
python-selenum3 第三天补充——截图和退出
查看>>
在RHEL/CentOS 5/6下停用按下Ctrl-Alt-Del 重启系统的功能
查看>>
linux下删除或重命名乱码文件
查看>>
当域用户存在于power users群组时如何安装打印机(图)
查看>>
安装redislive
查看>>
Python基础学习三 字符串
查看>>
RHEL6.3启动出错init:rcS post-stop process (1005) terminated with status 1
查看>>
解析发展方向,定格人生道路
查看>>
项目需求分析答辩总结
查看>>
怎样才能有效地在国内推广 Ubuntu?
查看>>
点一下某个按钮,表格样式变化。
查看>>
我的友情链接
查看>>
python爬虫项目(新手教程)之知乎(requests方式)
查看>>
Liunx 命令
查看>>
怎么成为一名熟练的iOS开发者
查看>>
C# datagridview绑定数据库
查看>>
CSS代码缩写、兼容浏览器技巧总结
查看>>
将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)...
查看>>
安卓五子棋(1)
查看>>