2012-03-06 4 views
1

사진 갤러리에서 이미지를 이메일에 첨부하는 데 약간의 문제가 있습니다.MFMailComposeViewController : 사진 갤러리에서 이미지 첨부

기본적으로 내 응용 프로그램의 기능 중 하나는 사용자가 사진을 찍을 수있게합니다. 그들이 스냅 샷을 찍을 때 이미지에 대한 URL 참조를 핵심 데이터에 기록합니다. 이미지로 이동하려면 ALAssetRepresentation을 거쳐야한다는 것을 이해합니다. 사용자가 찍은 이미지를 검토하기를 원하면 응용 프로그램 내에서이 작업을 실행해야합니다.

나는 이제 사용자가 이벤트에 대해 촬영 한 모든 사진을 이메일에 첨부 할 수 있도록 시도하고 있습니다. 이 작업을 수행하는 동안 URL References를 저장하는 Core Data 엔터티를 반복하고 ALAssetsLibrary에서 UIImage을 반환하는 메서드를 호출 한 다음 NSData/UIImageJPEGRepresentationMFMailComposeViewController/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]);') 아마이 시점에서 nil입니까? – calimarkus

+0

안녕 Jaydee, 내 추측은 당신이 옳다는 것입니다. 가능성이 없습니다. 하지만 어떻게해야합니까? 내가 잘못된 방식으로이 접근하고 있지만 UIImage 반환하는 메서드를 만드는? 포토 갤러리 이미지에 대한 URL 참조 목록을 통해 다른 내용을 반복해야합니까? – JasonBub

+0

그냥 올라가서 오류를 찾으십시오. 이미지가 nil 인 경우 참조 URL보다 분명히 잘못되었습니다. URL 작성 방법을 확인하십시오 .. – calimarkus

답변

5

아, 이제 알겠습니다. 비동기 블록을 사용하여 자산 라이브러리에서 이미지를 가져옵니다. 그러나 그 작업을 시작한 직후에 xImage을 반환합니다. 그러나 비동기 작업은 나중에 완료됩니다. 그래서 네가 돌아 오지 않을거야. 당신에

NSMutableArray* mArrayForImages; 
NSInteger mUnfinishedRequests; 

: 두 개의 새로운 회원을 필요로

당신의 .H 파일에서 :

당신은 다음과 같이 떨어지게하기 위해 건축 설계를 변경해야합니다.m 파일처럼 매끄러운 않습니다 마지막으로 메일을 보내기위한

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

그리고 별도의 방법

- (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)sendReportReport 
{ 
    // save image count 
    mUnfinishedRequests = [fetchedPhotos count]; 

    // get fetchedPhotos 
    [...] 

    // first step: load images 
    for (NSManagedObject *managedObject in fetchedPhotos) 
    { 
     [self loadImage:photo.referenceURL];  
    } 
} 
는 loadImage로 된 GetImage 방법을 변경

, 이미지를 가져온 후 :

- (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

나는 무엇이 잘못 되었는가를 정말로 알 수는 없지만 어떤 이유 때문에 배열에 어떤 객체도 추가되지 않는다. CoreData에 기록 된 두 개의 이미지가 있는데, CFImageRef는 두 번 호출됩니다. CFShow (iref)에서 을 얻을 수 있지만 CFShow (mArrayForImages)를 보면 (null) 나타납니다. 아키텍처가 실제로 들리지만 어떤 이유로 개체가 배열에 추가되지 않습니다. 그것은 내 메소드가 호출 될 때 일어났던 것과 실제로 비슷합니다. – JasonBub

+0

두 UIImageView 컨트롤과 UIButton으로 새로운 뷰를 새로 만들었으며 UIImageView의 핵심 데이터 URL 참조에서 이미지를 성공적으로 표시 할 수있었습니다. 나는 정말로 곤란하다. – JasonBub