我已经看过很多关于这个主题的帖子,但没有一篇能让我清楚地了解正在发生的事情。
我已经设置了一个涉及两个UIViewControllers的小测试:MainController和ModalController。
MainController上有一个按钮,它使用以下简单代码显示模态视图控制器:
ModalController *myModal = [[ModalController alloc] init];
[self presentModalViewController:myModal animated:YES];
[myModal release];
现在,如果我立即从同一个代码块中解除这个模态控制器,请按照下一行:
[self dismissModalViewControllerAnimated: YES];
模态视图不会被忽略。
在本网站上提出一些建议之后,我将dismissModalViewControllerAnimated
调用放在一个单独的方法中,然后我调用它:
[self performSelector:@selector(delayedDismissal) withObject:nil
afterDelay:0.41];
这是有效的 - 至少如果我延迟0.41或更长。 .40或更少,但不起作用。
此时,我假设我在这里处理一个需要赶上自己的运行循环,因为缺乏更好的描述。不幸的是,它不是很稳定。
因此,对于下一个测试,我使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 :(得分:1)
视图是动画,因此只要它是动画调用dismiss就行不通。
同样在你尝试的第二件事中,你称之为“延迟”,但你实际上在做的是说:“好的,这是这个可爱的方法,你可以在0.41秒之后执行吗?谢谢,在平均时间,称这种方法..“
解雇模态视图控制器应该通过用户界面完成,点击按钮,那你为什么要首先尝试这个呢?