2012-03-06 2 views
1

У меня возникли проблемы с прикреплением изображений из фотогалереи к электронному письму.MFMailComposeViewController: Присоединение изображений из фотогалереи

В принципе, одна из возможностей моего приложения позволяет пользователю делать фотографии. Когда они снимают снимок, я записываю ссылку URL в изображение в Core Data. Я понимаю, что вам нужно пройти через ALAssetRepresentation, чтобы добраться до изображения. У меня это работает и работает в моем приложении, когда пользователь хочет просмотреть изображение, которое они сделали.

Теперь я пытаюсь разрешить пользователю прикреплять все фотографии, сделанные для мероприятия, к электронному письму. Выполняя это, я перебираю объект Core Data, который хранит ссылки на ссылки, вызывает метод, который возвращает UIImage из ALAssetsLibrary, а затем присоединяет его, используя методы /UIImageJPEGRepresentation и MFMailComposeViewController/addAttachmentData.

Проблема: когда электронное письмо представлено пользователю, есть маленькие синие квадраты, представляющие изображения, и изображение не прилагается.

Вот код:

- (void)sendReportReport 
{ 

    if ([MFMailComposeViewController canSendMail]) 
    { 

     MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init]; 

     mailer.mailComposeDelegate = self; 

     [mailer setSubject:@"Log: Report"]; 

     NSArray *toRecipients = [NSArray arrayWithObjects:@"[email protected]", 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:

ПРИМЕЧАНИЕ: Это выше код мчит, он просто не прикрепить изображение. Кроме того, обратите внимание, что я могу успешно прикреплять изображения из галереи в своем приложении, так как долго я их установил в UIImageView. Я уже (в основном, я беру указатель на изображение из UIImageView и передавая его в addAttachmentData.) Это просто, когда я пытаюсь выполнить итерацию через Core Data и прикрепить без предварительной установки изображения в UIImageView, что у меня есть проблема.

Любые советы были бы высоко оценены!

Спасибо! Jason

+1

Вы распечатали содержимое изображения, прежде чем добавлять его в качестве вложения? ('CFShow ([self getImage: photo.referenceURL]);) Возможно, на данный момент это нуль? – calimarkus

+0

Привет, Джейди, я предполагаю, что ты прав. Это, вероятно, ноль. Но что мне делать? Я подхожу к этому не так, но создаю метод, который возвращает UIImage? Должен ли я делать что-то другое, чтобы перебирать список ссылок на ссылки на изображения фотоальбомов? – JasonBub

+0

просто поднимитесь, чтобы найти ошибку. Если изображение равно нулю, ваш ссылочный URL-адрес ошибочен. Поэтому проверьте, как создается URL-адрес. – calimarkus

ответ

5

О, теперь я его вижу .. sry. Вы используете асинхронный блок для получения изображения из библиотеки ресурсов. Но сразу после запуска этой операции вы возвращаетесь xImage. Но асинхронная операция завершится позже. Таким образом, вы возвращаете нуль.

Вы должны изменить свой architectur к чему-л так:

В вашем файле .h нужны два новых члена:

NSMutableArray* mArrayForImages; 
NSInteger mUnfinishedRequests; 

в вашем.м-файл сделать то вроде этого:

- (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 
    [...] 
} 
+0

Это замечательно Jaydee !!! Позвольте мне попробовать, и тогда я отмечу, что это ответили. Спасибо за помощь. Я ценю ваше время. – JasonBub

+0

Я действительно не могу понять, что не так, но по какой-то причине массив не получает никаких добавленных объектов. В Core Data есть два изображения, CFImageRef вызывается дважды, когда я смотрю CFShow (iref), я получаю , но когда я смотрю CFShow (mArrayForImages), я получаю (null). Ваша архитектура выглядит действительно здорово, но по какой-то причине объект не добавляется в массив. Это на самом деле похоже на то, что происходило, когда мой метод вызывался. – JasonBub

+0

Я только что создал еще один новый вид с двумя элементами управления UIImageView и UIButton и смог успешно отображать изображения из ссылок на ссылки на основные данные в UIImageView. Я действительно в тупике. – JasonBub