MFMailComposeViewController:从照片库附加图像

时间:2012-03-06 16:10:27

标签: iphone ios ios5 alassetslibrary messageui

我在将照片库中的图像附加到电子邮件时遇到了一些麻烦。

基本上,我的应用程序的一项功能允许用户拍照。当他们拍摄镜头时,我将URL参考记录到Core Data中的图像。我知道您必须通过ALAssetRepresentation才能看到图片。我已经在我的应用程序中运行并在用户想要查看他们拍摄的图像时运行。

我现在正尝试允许用户将为活动拍摄的所有照片附加到电子邮件中。执行此操作时,我遍历存储URL引用的Core Data实体,调用从UIImage返回ALAssetsLibrary的方法,然后使用NSData / {{1 }和UIImageJPEGRepresentation / MFMailComposeViewController方法。

问题是:当电子邮件呈现给用户时,表示图像的小蓝色方块没有附加图像。

以下是代码:

addAttachmentData

以及返回- (void)sendReportReport { if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init]; mailer.mailComposeDelegate = self; [mailer setSubject:@"Log: Report"]; NSArray *toRecipients = [NSArray arrayWithObjects:@"someone@someco.com", nil]; [mailer setToRecipients:toRecipients]; NSError *error; NSFetchRequest *fetchPhotos = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:__managedObjectContext]; [fetchPhotos setEntity:entity]; NSArray *fetchedPhotos = [__managedObjectContext executeFetchRequest:fetchPhotos error:&error]; int counter; for (NSManagedObject *managedObject in fetchedPhotos ) { Photo *photo = (Photo *)managedObject; // UIImage *myImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", counter++]]; NSData *imageData = UIImageJPEGRepresentation([self getImage:photo.referenceURL], 0.5); // NSData *imageData = UIImagePNGRepresentation([self getImage:photo.referenceURL]); // [mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"%i", counter]]; [mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"a.jpg"]]; counter++; } NSString *emailBody = [self getEmailBody]; [mailer setMessageBody:emailBody isHTML:NO]; [self presentModalViewController:mailer animated:YES]; } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure" message:@"Your device doesn't support the composer sheet" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } 的方法:

UIImage

注意:上面的代码确实运行,它根本不附加图像。另外,请注意,我能够在我的应用程序中成功附加图库中的图像,只要我已将它们设置为#pragma mark - Get Photo from Asset Library + (ALAssetsLibrary *)defaultAssetsLibrary { static dispatch_once_t pred = 0; static ALAssetsLibrary *library = nil; dispatch_once(&pred, ^{ library = [[ALAssetsLibrary alloc] init]; }); return library; } - (UIImage *)getImage:(NSString *)URLReference { __block UIImage *xPhoto = nil; ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { UIImage *xImage; // get the image ALAssetRepresentation *rep = [myasset defaultRepresentation]; CGImageRef iref = [rep fullScreenImage]; if (iref) { xImage = [UIImage imageWithCGImage:iref]; } xPhoto = xImage; }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { NSLog(@"Error fetching photo: %@",[myerror localizedDescription]); }; NSURL *asseturl = [NSURL URLWithString:URLReference]; // create library and set callbacks ALAssetsLibrary *al = [DetailsViewController defaultAssetsLibrary]; [al assetForURL:asseturl resultBlock:resultblock failureBlock:failureblock]; return xPhoto; } 。图像已经(基本上,我正在将指针指向{{{ 1}}并将其传递给UIImageView方法。)当我尝试迭代核心数据并附加而没有先将图像设置为UIImageView我遇到麻烦时。

任何提示都将不胜感激!

谢谢! 杰森

1 个答案:

答案 0 :(得分:5)

哦,现在我明白了.. sry。您正在使用异步块从资产库中获取图像。但是在开始该操作之后,您将返回xImage。但异步操作将在稍后完成。所以你回来了。

你需要改变你的架构,就像这样:

在.h文件中,您需要两个新成员:

NSMutableArray* mArrayForImages;
NSInteger mUnfinishedRequests;

在.m文件中,请执行以下操作:

- (void)sendReportReport
{
    // save image count
    mUnfinishedRequests = [fetchedPhotos count];

    // get fetchedPhotos
    [...]

    // first step: load images
    for (NSManagedObject *managedObject in fetchedPhotos )
    {
        [self loadImage:photo.referenceURL];    
    }
}

将getImage方法更改为loadImage:

- (void)loadImage:(NSString *)URLReference
{
    NSURL *asseturl = [NSURL URLWithString:URLReference];

    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {    
        // get the image
        ALAssetRepresentation *rep = [myasset defaultRepresentation];
        CGImageRef iref = [rep fullScreenImage];

        if (iref) {
            [mArrayForImages addObject: [UIImage imageWithCGImage:iref]];
        } else {
            // handle error
        }

        [self performSelectorOnMainThread: @selector(imageRequestFinished)];
    };

    ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
    {
        NSLog(@"Error fetching photo: %@",[myerror localizedDescription]);

        [self performSelectorOnMainThread: @selector(imageRequestFinished)];
    };


    // create library and set callbacks
    ALAssetsLibrary *al = [DetailsViewController defaultAssetsLibrary];
    [al assetForURL:asseturl 
        resultBlock:resultblock
       failureBlock:failureblock];
}

创建一个新的回调方法:

- (void) imageRequestFinished
{
    mUnfinishedRequests--;
    if(mUnfinishedRequests <= 0)
    {
       [self sendMail];
    }
}

获取图片后最终发送邮件的额外方法:

- (void) sendMail
{
    // crate mailcomposer etc
    [...]

    // attach images
    for (UIImage *photo in mArrayForImages )
    {
                NSData *imageData = UIImageJPEGRepresentation(photo, 0.5);
                [mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"a.jpg"]];
    }

    // send mail
    [...]
}