2

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

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

我试图关闭activityViewController.completionHandler中的模态视图,但随后控制台说另一个动画正在处理中,有时会使应用程序崩溃,所以这不是解决方案。除了其他社交网络(脸书、推特)运行良好外,无需执行任何操作。

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

UIViewController > UINavigationController > UITabbarController > Window

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

UIViewController > UINavigationController > Window 

解决问题的解决方法是从 rootviewcontroller 中提出的。

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

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

谢谢!;)

4

1 回答 1

0

我遇到了同样的问题,在弄清楚之后我才知道,当我们不从当前在 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”的替代方案。

于 2013-11-05T08:35:24.633 回答