【问题标题】:Why UIActivityViewController doesn't dismiss MFMailComposeViewController when the presenter is a UITabbarController child?当演示者是 UITabbarController 孩子时,为什么 UIActivityViewController 不会关闭 MFMailComposeViewController?
【发布时间】:2013-11-05 07:36:56
【问题描述】:

我有一个非常简单的例子,一个按钮显示一个 UIActivityViewController 来分享一些内容。问题是当用户取消或发送电子邮件时,邮件编写器没有被解雇。

NSArray *items = [NSArray arrayWithObjects:@"share",nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];

我试图关闭 activityViewController.completionHandler 中的模态视图,但控制台说另一个动画正在处理中,有时会导致应用程序崩溃,所以这不是解决方案。除了其他社交网络(facebook、twitter)运行良好之外,无需做任何事情。

经过一些测试后,我发现只有在呈现 UIActivityViewController 的 UIViewController 是 UITabBarController 的子项时才会发生这种情况。 如果在我的 AppDelegate 中创建这样的应用程序,它不起作用:

UIViewController > UINavigationController > UITabbarController > Window

但如果我删除标签栏一切正常!:

UIViewController > UINavigationController > Window 

根视图控制器提供了解决问题的解决方法。

[self.view.window.rootViewController presentViewController:activityViewController animated:YES completion:NULL];

但我想知道这里发生了什么。

谢谢! ;)

【问题讨论】:

    标签: ios uitabbarcontroller uiactivityviewcontroller


    【解决方案1】:

    我遇到了同样的问题,在弄清楚后我知道,当我们不从当前在 window 上活动的类中展示邮件编写器时,它会在一段时间内无法响应,就像它甚至不会出现一样在每次通话中,解雇的问题都是一样的。 并不是只有 UITabbarController 才有这种情况。当您从当前不在窗口上的不同控制器呈现它时,任何架构都可能发生这种情况。这就是为什么您的解决方法有效并且它没有错。

    我正在通过在 uipopover 内点击的按钮展示邮件编写器。邮件编写器出现在那个弹出框控制器类中。我也面临着你面临的同样问题。然后我将代码更改为:

    MFMailComposeViewController *mailComposer = [MFMailComposeViewController new];
    
        [mailComposer addAttachmentData:data mimeType:@"application/pdf" fileName:model.documentTitle];
    
        [mailComposer setSubject:model.documentTitle]; // Use the document file name for the subject
    
        if(kBccEmailID)
            [mailComposer setBccRecipients:[[NSArray alloc]initWithObjects:kBccEmailID, nil ]];
    
        mailComposer.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    
        mailComposer.modalPresentationStyle = UIModalPresentationFormSheet;
    
        AppDelegate *delagate =(AppDelegate *) [[UIApplication sharedApplication]delegate];
    
        mailComposer.mailComposeDelegate = [[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject]; // Set the delegate
    
    
        [(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] presentViewController:mailComposer animated:YES completion:nil];
    

    [(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] 是“self.view.window.rootViewController”的替代方案。

    【讨论】:

    • 有趣!但我不明白系统如何确定当前在窗口中哪个类处于活动状态。为什么当 VC 在它认为不是活动控制器的 tabbarcontroller 中时?
    • 您无需为此烦恼。是系统负责处理它。它通过堆栈跟踪视图控制器,从而使他成为顶部的控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多