0

我正在开发一个 iOS 应用程序,我想在其中使用 UIActivityItemProvider 将多个附件添加到电子邮件中。我想使用 UIActivityItemProvider 来做到这一点,因为我不想在向用户显示 UIActivtyViewController 之前产生处理记录的开销。如果我使用 NSData 或 NSURL 对象将一个图像传递给返回对象的“url”元素,则内联图像显示正常。如果我传入这些对象的数组,那么什么都不会出现。我相信,如果我在初始化 NSActivityViewController 时使用 ActivityItems 参数,传递一个数组会起作用,但同样,我不想这样做,因为我想利用通过使用 UIActivityItemProvider 提供的延迟处理。下面是我的代码

@implementation NoteRecordActivityProvider

- (id)initWithPlaceholderItem:(id)placeholderItem
{
    //Initializes and returns a provider object with the specified placeholder data
    return [super initWithPlaceholderItem:placeholderItem];
}

- (id)item
{
//    //Generates and returns the actual data object
    NSData *imageFile = [[NSData alloc]init];
    NSString *imageFileName;
    NSURL *url;
    NSString* exportPath;
    NSMutableArray* imageArray = [[NSMutableArray alloc]initWithCapacity:0];
    NSInteger photoCount = self.noteRecord.photoCount;
    for (NSInteger i = 0; i < photoCount; i+=1)
    {
        //Add File Attachment
        PhotoObject *po = (PhotoObject*)[self.noteRecord photoObjects:i];
        NSString *photoGUID = [(PhotoObject*)[self.noteRecord photoObjects:i]GUID];
        imageFile = ImageDataReturningMethodHere;
        imageFileName = [[NSArray arrayWithObjects:@"Image", [NSString stringWithFormat:@"%ld", (long)i], @".png", nil] componentsJoinedByString:@""];
        exportPath = [[FileSystemProvider exportPath] stringByAppendingPathComponent:imageFileName];
        [imageFile writeToFile:exportPath atomically:YES];
        url = [NSURL fileURLWithPath:exportPath];
        [imageArray addObject:url];
    }
    if ([self.activityType isEqualToString:UIActivityTypeMail])
        return imageArray;
    else
        return nil;
}

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    return @{@"body":@"", @"url":[[NSURL alloc]init]};
}

-(NSString *) activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType {
    return [NSString stringWithFormat:@"Attached Record:  %@", self.noteRecord.title];
}

@end
4

1 回答 1

0

我确实找到了这个问题的答案。首先,我创建了一个 PhotoAttachmentActivityProvider,它具有源文档的属性,其中包含我要附加的照片,以及该文档中附件的索引。我在这里粘贴我的代码,它使用了一个名为 NoteRecord 的自定义文档:

@interface EMailPhotoAttachmentItemProvider : UIActivityItemProvider
@property (nonatomic, readwrite) NSInteger photoIndex;
@property (nonatomic, strong) NoteRecord* noteRecord;
@end

然后,当我显示 UIActivityViewController 时,我为每个附件添加 1 个这些自定义 UIActivityItemProvider 对象:

for (NSInteger i = 0; i < self.noteRecord.photoCount;  i++)
{
    EMailPhotoAttachmentItemProvider* photoProvider =     [[EMailPhotoAttachmentItemProvider alloc]initWithPlaceholderItem:@{@"body":textToShare, @"url":url}];
    photoProvider.photoIndex = i;
    photoProvider.noteRecord = self.noteRecord;
    [activityProviders addObject:photoProvider];
}

//Initialize the ActivityViewController
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityProviders applicationActivities:applicationActivities];

然后在自定义 UIActivityItemProvider 中检查是否正在处理 EMAIL,然后使用提供的文档和图像索引为图像创建 URL:

#import "EMailPhotoAttachmentItemProvider.h"
#import "MiscUtilities.h"
#import "FileSystemProvider.h"

@implementation EMailPhotoAttachmentItemProvider

- (id)initWithPlaceholderItem:(id)placeholderItem
{
    //Initializes and returns a provider object with the specified placeholder data
    return [super initWithPlaceholderItem:placeholderItem];
}

- (id)item
    {    
    if ([self.activityType isEqualToString:UIActivityTypeMail])
    {
        // Code here gets the image file from the NoteRecord at the PhotoIndex provided to  
        // the UIActivityItemProvider at the imageIndex, creates a URL for that image and returns it here.  
        // Your implementation will vary

        PhotoObject *po = (PhotoObject*)[self.noteRecord photoObjects:self.photoIndex];
        NSString *photoGUID = [(PhotoObject*)[self.noteRecord photoObjects:self.photoIndex]GUID];
        NSData *imageFile = [[[MiscUtilities getApplicationDelegate]imageProvider]imageDataWithCaptionFromGUID:photoGUID caption:po.caption maxResolution:600];
        NSString *imageFileName = [[NSArray arrayWithObjects:@"Image", [NSString stringWithFormat:@"%ld", (long)self.photoIndex], @".png", nil] componentsJoinedByString:@""];
        imageFileName = [[FileSystemProvider exportPath] stringByAppendingPathComponent:imageFileName];
        [imageFile writeToFile:imageFileName atomically:YES];
        NSURL *url = [NSURL fileURLWithPath:imageFileName];
        return url;
    }
    else
    {
        return nil;
    };

}

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    NSString* defaultImagePath = [[FileSystemProvider imagePath]stringByAppendingPathComponent:@"default.png"];
    NSURL *url = [[NSURL alloc]initWithString:defaultImagePath];
    return @{@"body":@"", @"url":url};
}
@end
于 2017-09-26T16:53:42.850 回答