0

Ich arbeite an einer iOS-App, in der ich hinzufügen möchten MULTIPLE Anhänge zu einer E-Mail mit UIActivityItemProvider. Ich möchte es mit UIActivityItemProvider tun, weil ich nicht den Aufwand für die Verarbeitung des Datensatzes übernehmen möchte, bevor ich den UIActivityViewController für den Benutzer anzeigen. Wenn ich ein Bild mit einem NSData-Objekt oder einem NSURL-Objekt an das "url" -Element des zurückgegebenen Objekts übergebe, wird das eingebettete Bild als gut angezeigt. Wenn ich ein Array dieser Objekte übergebe, taucht nichts auf. Ich glaube, dass das Übergeben eines Arrays funktioniert, wenn ich den ActivityItems-Parameter beim Initialisieren eines NSActivityViewController verwende, aber das möchte ich auch nicht, weil ich die verzögerte Verarbeitung, die mit dem UIActivityItemProvider verfügbar ist, nutzen möchte. Unten ist mein CodeWie Sie mehrere E-Mail-Anhänge mit UIActivityItemProvider hinzufügen

@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 
+0

Gleiche Ausgabe h ehe... –

Antwort

0

Ich habe die Antwort auf diese Frage gefunden. Zuerst erstellte ich einen PhotoAttachmentActivityProvider, der eine Eigenschaft für das Quelldokument hatte, die das Foto, das ich anhängen wollte, und einen Index für den Anhang in diesem Dokument enthielt. Ich bin Einfügen mein Code hier, die ein benutzerdefiniertes Dokument verwendet eine NoteRecord genannt:

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

Dann, wenn ich die UIActivityViewController zeige ich hinzufügen 1 dieser benutzerdefinierten UIActivityItemProvider Objekte für jede Anlage:

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]; 

Dann in der benutzerdefinierten UIActivityItemProvider ich prüfen, ob ich eine E-Mail bin Verarbeitung, und dann erstelle ich eine URL für das Bild mit dem Dokumenten- und Bildindex zur Verfügung gestellt:

#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 
Verwandte Themen