2

我很想通过电子邮件分享我的 iOS 6.0 应用程序的自定义内容。

但由于我的内容需要一些时间才能分享,所以当用户按下“分享”按钮时,我无法立即显示邮件撰写视图。不幸的是,MFMailComposeViewController 从一开始就需要所有附件,所以我必须等待附件才能初始化并显示 MFMailComposeViewController(就像这里建议的那样:UIActivityView attach file to Email

-- 阅读 Sapan 的回答后进行编辑:我正在寻找的是像 UIActivityViewController 共享时的行为,例如一个尚未创建的视频文件:用户按下共享按钮,UIActivityController 立即出现。附件是在后台创建的,创建不会中断用户的体验。--

我尝试了 UIActivityViewController ,它具有很好的异步 UIActivityItemProvider 功能,但不幸的是,这似乎只适用于具有公共 mime 类型(如图像和视频)的附件。我的自定义 NSData '项目' 被忽略了,不仅因为在 facebook 上分享(这很有意义),而且因为电子邮件分享。或者我在这里做错了什么:

MyUIActivityItemProvider *myCustomDocProvider = [[MyUIActivityItemProvider alloc] initWithPlaceholderItem:[[NSData alloc]init] andCustomInfoToCreateNSDataFrom:customAppInfo];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:@[myTextString, myCustomDocProvider] applicationActivities:nil];
[self presentViewController:activityVC animated:YES completion:nil];

我已经在考虑创建自己的自定义电子邮件编写器视图,以便在用户键入时/之后在后台创建附件。但我不想。我喜欢我在 HIG 中读到的“UI 元素的一致性”的想法。

我能做些什么?

4

3 回答 3

1

您可以按如下方式创建一个方法,然后使用[self performSelectorInBackground:@selector(sendMail)];

-(void) sendMail
{
    // Prepare the data

    // Attach the data
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    [picker addAttachmentData:myData mimeType:@"<YOUR-MIME-TYPE>" fileName:@"Filename"];

    // Show compose view controller on the main thread
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        // Fill out the email body text
        NSString *emailBody = @"Body";
        [picker setMessageBody:emailBody isHTML:NO];
        [self presentModalViewController:picker animated:YES];
    });
}
于 2012-11-12T22:22:18.707 回答
0

您可以做的是将您的邮件正文设置为 HTML,其中包含从远程服务器引用的图像或媒体。然后用户将在邮件撰写视图中看到损坏的图像(也许您可以使用一些巧妙的 HTML 隐藏它)但是在收到邮件时应该完成上传。

不是最佳选择,因为它在发送电子邮件后可能会失败,但可能是您最好的选择。

于 2012-12-11T22:42:52.867 回答
0

这可以通过在 myCustomDocProvider 中使用布尔值来保存项目的返回,直到文件的构建完成。如果您想在主视图上显示进度或显示活动指示器,您可以通过从主线程调用它来实现。这是一个实际的代码片段:

使用此功能在您的提供程序中设置活动视图控制器以加载进度视图。

self.parentViewController = parentVc;

这是具有阻塞和反馈视图加载的项目功能。

self.wait = true;

[self prepareFile:^(){
    [self performSelectorOnMainThread:@selector(dismissProgressView) 
                              withObject:nil waitUntilDone:NO];
}];

[self performSelectorOnMainThread:@selector(loadProgressView) 
                              withObject:nil waitUntilDone:NO];

while (self.wait) {
    [self performSelectorOnMainThread:@selector(updateProgressView) 
                                     withObject:nil waitUntilDone:NO];
}

return self.completedUrl;

然后,您可以创建在主线程上调用的三个函数以显示进度视图,在等待文件完成时更新进度视图。在dismissProgressView 函数的实现中,请确保dismissViewController 完成时将wait boolean 设置为false。

于 2013-03-29T03:05:32.683 回答