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的主要内容,如果未能解决你的问题,请参考以下文章