dismissModalViewControllerAnimated mystery

问题描述:

我在这个主题上看过很多文章,但没有一篇让我清楚地理解发生了什么。dismissModalViewControllerAnimated mystery

我已经设置了一个涉及两个UIViewControllers的小测试:MainController和ModalController。

MainController上有一个按钮,利用以下简单的代码呈现一个模态视图控制器:

ModalController *myModal = [[ModalController alloc] init]; 
[self presentModalViewController:myModal animated:YES]; 
[myModal release]; 

现在,如果我立即从相同的代码块内关闭此模态控制器,按照该下一line:

[self dismissModalViewControllerAnimated: YES]; 

模态视图不排除。

继本网站上的一些建议,我把dismissModalViewControllerAnimated呼叫在一个单独的方法,我然后叫:

[self performSelector:@selector(delayedDismissal) withObject:nil 
    afterDelay:0.41]; 

这工作 - 至少,如果我做了延迟0.41或更高。 .40或更少,它不起作用。

在这一点上,我假设我在这里处理一个需要赶上自己的运行循环,因为缺乏更好的描述。该死的片状,如果你问我,但c'est la vie。

所以,在接下来的测试中,我让delayedDismissal做什么 - 它只会提供延迟 - 并重新插入dismissModalViewControllerAnimated回拨原块,这样我的代码现在看起来像这样:

ModalController *myModal = [[ModalController alloc] init]; 
[self presentModalViewController:myModal animated:YES]; 
[myModal release]; 
self performSelector:@selector(delayedDismissal) withObject:nil 
     afterDelay:0.41]; // to create the false delay 
[self dismissModalViewControllerAnimated: YES]; 

...现在dismissModalViewControllerAnimated不再工作,无论我使用多长时间的延迟。

所以...有人会知道善意解释这里发生了什么?我认识到,和其他人一样,我可以通过各种解决方法实现自己的目标,包括使用委托等。但是我认为,对于遇到此问题的每个人都应该彻底了解问题和适合此场景的解决方案。顺便说一句,这种情况下的一个用例是在用户没有与该屏幕交互的情况下以模式呈现加载屏幕......它仅用于呈现信息,同时阻止用户采取行动。

韦恩

的观点是动画,因此只要是动画呼吁解雇将无法正常工作。

另外,在第二件事情中,你尝试了一个“延迟”,但实际上你做的是说下面的内容:“好的,这是一个可爱的方法,你可以在0.41秒后执行吗?平均时间,称这种方法..“

关闭模式视图控制器应该通过用户界面完成,通过点击一个按钮,所以你为什么试图在第一个地方?

+0

首先,感谢我对第二个实验的澄清。我的真正最终目标是使用模式形式在灾难恢复场景中传达有关长时间运行同步的信息(即应用程序在恢复同步完成之前无法使用)。我有理由选择UIAlertView或UIActionSheet上的模态表单,但重点是,用户不会与模态表单交互。应用程序本身必须关闭所述表单。事实是,我会以委托方式做到这一点,所以我怀疑我会遇到问题。但是,当我设置这个小... – wayne 2011-06-13 10:03:49

+0

...实验,我很惊讶地看到这种行为。关于“解雇一个模态视图控制器应该通过用户界面完成,点击一个按钮”的评论,你会如何建议我实现了我的目标?我有太多的信息要传递到UIAlertView或UIActionSheet中,我不希望用户忍受尝试与已损坏的应用程序进行交互的挫败感,那么在此类恢复过程中我有哪些其他选择? – wayne 2011-06-13 10:07:57

+0

@wayne UIAlertView在被解雇之前还需要用户操作,对吗?然后在你的modalview上实现这样一个按钮!而且我个人认为你不应该向iPhone用户显示如此多的数据,但是我再次不知道上下文。 – 2011-06-13 10:17:42