iOS:当已经显示邮件撰写视图时,如何在后台创建/准备自定义电子邮件附件



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

但是,由于我的内容需要一些时间才能准备好之前,因此当用户按"共享"按钮时,我无法立即显示邮件构成视图。不幸的是,MFMailComposeViewController从一开始就需要所有附件,因此我必须等待附件,然后才能启动并显示MFMailComposeViewController(如下所示:uiactivityview fievie view contact contact contact contact to emaim to Email to Email to Email)

) ) ) ) )

- 阅读Sapan的答案后进行编辑:我正在寻找的是类似于uiactivityViewController的行为,例如必须创建的视频文件:用户按共享按钮,并立即显示uiactivityController。附件是在后台创建的,创建不会中断用户的体验。 -

我尝试了使用它的uiactivityViewController,它是很好的异步UiActivityItemprovider功能,但不幸的是,这似乎仅适用于具有图像和视频(例如图像和视频)的附件。我的自定义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元素一致性"的想法。

我该怎么办?

您可以创建一个方法如下,然后使用[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];
    });
}

您可以做的是将邮件主体设置为HTML,并使用从远程服务器引用的图像或媒体将邮件主体设置为HTML。然后,用户将在邮件组合视图中看到一个损坏的图像(也许您可以使用一些巧妙的HTML隐藏此图片),但是在收到邮件时,应该完成上传。

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

这可以通过使用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;

您可以创建在主线程上调用的三个函数以显示进度视图,在等待文件完成时更新进度视图。在实现diviveProgressView函数时,请确保将Wait Boolean设置为false时,当OverViewController完成时。

最新更新