关于presentModalViewController的一点儿思考

简介: 关于presentModalViewController的一点儿思考   有一个多月没有写blog了,手有点儿生。今天没事儿,突然想起以前文档中看到关于弹出模态对话框的一个知识点,于是想着何不动手验证一下。

关于presentModalViewController的一点儿思考

  有一个多月没有写blog了,手有点儿生。今天没事儿,突然想起以前文档中看到关于弹出模态对话框的一个知识点,于是想着何不动手验证一下。

  我们都知道使用弹出模态视图时有两个重要的函数presentModalViewController和dismissModalViewControllerAnimated,前面一个函数相信大家使用起来都没有问题,我想说的是后面这个函数dismissModalViewControllerAnimated,通过字面我们可以看出它的意思就是使弹出视图消失。我们设A弹出B,那么A就是presenting一方,B就是presented一方。那么该由谁来调用这个方法呢,是弹出的一方,还是被弹出的那一方呢,为此找到官方文档中如下解释:

The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, however, it automatically forwards the message to the presenting view controller.

  通过解释我们可以看出,presenting一方是负责让弹出模态视图消失的,但是系统在此处帮我们做了一个遍历就是当我们在被弹出一方调用该函数时候,系统会自动把这个消息传递到弹出它的那个VC中。

  下面我们在思考个问题,如果A弹出B,B又弹出C,此时我们通过B调用dismissModalViewControllerAnimated方法,到底是只有C被dismiss还是B和C一起被dismiss呢?

  我写了一个小程序验证了一下,程序如下:

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 2 {
 3     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
 4     // Override point for customization after application launch.
 5     _svVCA = [[SvViewController alloc] initWithNibName:nil bundle:nil];
 6     self.viewController = [[[UINavigationController alloc] initWithRootViewController:_svVCA] autorelease];
 7     [_svVCA release];
 8     _svVCA.view.backgroundColor = [UIColor clearColor];
 9     _svVCA.contentStr = @"A";
10     
11     self.window.rootViewController = self.viewController;    
12     [self.window makeKeyAndVisible];
13     
14     _svVCB = [[SvViewController alloc] init];
15     _svVCB.contentStr = @"B";
16     [_svVCA presentModalViewController:_svVCB animated:NO];
17     [_svVCB release];
18     
19     _svVCC = [[SvViewController alloc] init];
20     _svVCC.contentStr = @"C";
21     [_svVCB presentModalViewController:_svVCC animated:NO];
22     [_svVCC release];
23     
24     [_svVCB dismissModalViewControllerAnimated:NO];
25     //[_svVCB dismissModalViewControllerAnimated:NO];
26     
27     return YES;
28 }

  上面程序中我们可以看出,一开始我们创建一个A,然后添加到window中,然后弹出B,B在弹出C,接着我们就调用[_svVCB dismissModalViewControllerAnimated:NO];

  运行结果如下:

    

  上图中最左边的图是没有调用任何dismiss的情况下的结果,中间这幅图是通过B调用一次dismissModalViewControllerAnimated的结果,右边的图是连着通过B调用两次dismissModalViewControllerAnimated的结果。

  通过程序测试我们可以发现当一个VC即是被弹出方(被A弹出),也是弹出方(弹出C)的时候,调用dismiss的时候是直接将其弹出的VC消失掉,而不是传递该消息到弹出它的VC去,只有当该VC没有弹出别的VC的时候才会传递消息到弹出它的VC去。这块儿可能说的有点儿绕,简单的说就是无私原则,就是B已经占了资源了,当接到释放命令的时候,就必须的先交出自己的,自己没有占有资源的时候才能尝试向上一级发出申请。


部门招人: 高级iOS、Android、前端开发,有意私聊,博主请你喝️
如果觉得本文帮到了你,记得点赞哦,当然也可以请博主喝一杯豆浆
微信二维码 QQ二维码
目录
相关文章
|
6月前
|
数据采集 大数据 Python
学Python静不下来,看了一堆资料还是很迷茫是为什么
学Python静不下来,看了一堆资料还是很迷茫是为什么
62 2
学Python静不下来,看了一堆资料还是很迷茫是为什么
|
前端开发 数据库
贼无聊的文章
贼无聊的文章
41 0
|
设计模式 缓存 算法
花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。
162 0
|
开发者
试着做点儿有趣的事情
一个游戏怎样才算是做完了?这是个因人而异的问题。有些游戏还没有做出来就做完了,因为开发者不想再做了。有的游戏看上去做完了,但是后续还在不停的更新,那我们就说这个游戏其实还没有做完。至于如何算是做完了,我觉得这应该交由该游戏的制作者来决定。
86 0
|
IDE 开发工具 Python
这样的奇技淫巧,劝你不用也罢
这样的奇技淫巧,劝你不用也罢
138 0
|
设计模式 移动开发 安全
与其硬啃“屎山”代码,不如用这六步有条不紊实现代码重构 李慧文
对大规模系统进行重构,如果一个人对着又臭又长的代码硬刚,即使花了大量的时间进行手工验证,最后仍然会有很多问题,特别是一些深路径及特殊场景下的问题。其实,大规模的系统级别重构时是有方法的。我们采访了 Thoughtworks 数字化转型与运营 资深咨询师黄俊彬(QCon+案例研习社讲师),请他来分享 MV*模式重构演进的方法和经验。
568 0
与其硬啃“屎山”代码,不如用这六步有条不紊实现代码重构 李慧文
|
开发工具
电脑屏幕太小不够用?这有妙招!
为什么需要分屏功能?其实需求场合有很多。比如,我现在屏幕很大,但我们的代码一般是左对齐,右边很空,这样我们就可以通过分屏来充分利用右边的屏幕。再如,我现在想同时查看多个文档,除了打开多个终端外,我们还可以通过分屏来达到我们的目的。
185 0
电脑屏幕太小不够用?这有妙招!
|
芯片
假如一瞬间让所有人拥有世界上所有的知识 | 20181116奇葩说犀利言句摘录
“美国经济学家 诺奖得主西奥多·舒尔茨 研究结果:当社会的平均受教育水平更高的时候,贫富差距会越来越小——一旦共享知识了,人人变得更博学了,那个这个世界,将会每个角落的贫富差距都会在缩小,寒门将出更多的贵子” 人类文明最大的教训,就是对技术的警惕,对人性的宽容; 人类文明最大的经验,就是对技术的宽容,对人性的警惕。
1125 0

相关实验场景

更多