objective-c - 解除ModalViewController动画之谜

标签 objective-c ios uikit modalviewcontroller

我看过很多关于这个主题的帖子,但没有一个能让我清楚地了解正在发生的事情。

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

MainController 上有一个按钮,使用以下简单代码呈现模态视图 Controller :

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

现在,如果我立即从同一代码块中关闭此模态 Controller ,如下一行所示:

[self dismissModalViewControllerAnimated: YES];

模态视图不会关闭。

根据本网站上的一些建议,我将 dismissModalViewControllerAnimated 调用放在一个单独的方法中,然后使用以下方法调用:

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

这有效 - 至少如果我将延迟设置为 0.41 或更大。 .40 或更低,它不起作用。

此时,我假设我正在处理一个需要 catch 自身的运行循环,因为缺乏更好的描述。不幸的是,它不是很稳定。

因此,对于下一个测试,我让delayedDismissal什么也不做——它只是提供延迟——然后将dismissModalViewControllerAnimated回调重新插入到原始 block 中,这样我的代码现在看起来像这样:

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 都不再起作用。

那么,这里发生了什么?我意识到,像其他人一样,我可以通过各种解决方法来实现我的目标,包括使用委托(delegate)等。但我真的认为,对于遇到此问题的每个人来说,彻底了解问题和解决问题是有好处的。这种情况的正确解决方案。顺便说一句,此场景的一个用例是以模态方式呈现加载屏幕,其中用户与该屏幕没有交互;它只是用于呈现信息,同时阻止用户采取操作。

最佳答案

View 是动画的,因此只要它是动画的,调用解雇就不起作用。

此外,在您尝试的第二件事中,您正在调用“延迟”,但您实际上正在做的是说以下内容:“好吧,这是这个可爱的方法,您可以在 0.41 秒后执行它吗?谢谢,在同时,调用这个方法..”

应该通过用户界面单击按钮来关闭模态视图 Controller ,那么您为什么要首先尝试此操作?

关于objective-c - 解除ModalViewController动画之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6327604/

相关文章:

iphone - 伪私有(private)方法的实现文件中的方法原型(prototype)?

ios - 只需要在AFNetworking中执行一个HTTP操作,取消之前的一个

ios - 如何以编程方式创建带有动态选项卡的选项卡栏?底部黑屏问题

iphone - 检测一个int是否连续重复

objective-c - 检查包含 "http://"URL 的字符串

c++ - C/C++/Obj-C 中的符号数学库

ios - UITableView 上的 UISearchBar 奇怪的偏移问题

ios - 使用 Alamofire 5 下载多个 URL

ios - UITableViewAutomaticDimension 来适应 subview

ios - 在导航 Controller 中时,忽略 View Controller 的首选状态栏样式