dismissModalViewController 然后是 popViewController
Posted
技术标签:
【中文标题】dismissModalViewController 然后是 popViewController【英文标题】:dismissModalViewController then popViewController 【发布时间】:2012-01-17 21:03:10 【问题描述】:我一直在寻找解决问题的方法,但到目前为止还没有找到任何东西。
我有一个 UINavigationController 和一堆 UIViewControllers(如果相关,这都在 TabbarController 中)。在最后一个ViewController,我想发邮件:
MFMailComposeViewController *emailVC = [[MFMailComposeViewController alloc] init];
// fill out emailVC properties ...
[self presentModalViewController:emailVC animated:YES];
然后在发送电子邮件后的委托中,我想关闭电子邮件视图控制器并弹出 NavigationController 堆栈中的最后一个视图控制器:
-(void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
// save some variables here ...
[self dismissModalViewControllerAnimated:YES]; // This line works by itself
[self.navigationController popViewControllerAnimated:NO]; // this line causes EXC_BAD_ACCESS
但是,最后一行会导致某处崩溃。 我之前和之后检查了 ViewController 堆栈。最后一个 viewController 正确地从列表中删除。
欢迎任何想法或建议。问题可能出在我的代码中的其他地方,我想确保这部分没问题。谢谢。
【问题讨论】:
【参考方案1】:尝试启动延迟弹出
iOS 3 及更高版本解决方案
-(void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
[...]
[self dismissModalViewControllerAnimated:YES];
[self performSelector:@selector(doThePop) withObject:nil afterDelay:0.40];
[...]
- (void)doThePop
[self.navigationController popViewControllerAnimated:NO];
您可能需要微调延迟。
iOS 5 及更高版本解决方案
-(void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
[...]
[self dismissViewControllerAnimated:YES completion:^
[self.navigationController popViewControllerAnimated:NO];
];
[...]
尽管这看起来有点骇人听闻,但它应该可以工作。
【讨论】:
是的,这行得通!非常感谢。你知道它为什么起作用吗? 其实我之前也遇到过这样的问题,就是这样解决的。恐怕我不知道它为什么起作用,我只是有这个想法,测试它并且它起作用了。我认为需要完全取消该模态视图以保持适当的 viewController 堆栈,从而使弹出窗口正常运行。每当我遇到一些看起来很奇怪并且应该与动画 UIKit 任务相关但无法正常工作的事情时,我都会尝试这种方式。 这在 ios 5 中通常不起作用,因为 self.navigationController 对于模态视图控制器是 null :( @Adam 不确定您指的是什么。上面草拟的方法不是在模态显示的视图控制器上调用,而是在 mailComposeViewController 的委托上调用。该委托是一个 viewController,被描述为问题中导航堆栈的一部分。 问题一开始是通用的,然后是具体的。您的回答很棒,几乎但不是完全解决一般问题的答案。这个问题是通用问题的热门谷歌搜索:(。如果您“保存”对presentingViewController的引用,然后使用块方法,通用解决方案就可以工作......但如果你只是做错事,它似乎也可以工作并直接执行“popViewController”——我认为苹果已经添加了特殊情况代码来处理这种情况。以上是关于dismissModalViewController 然后是 popViewController的主要内容,如果未能解决你的问题,请参考以下文章