2014-04-07 8 views
0

매우 일반적인 문제인 것처럼 보였습니다. 스택 오버플로가 도움이되었습니다. 이것으로.PDF 문서 디렉토리에 저장 됨 디렉토리가 연결되지 않음 (데이터 없음) MFMailCompose가 처음 실행될 때마다 다른 모든 시간이 있습니다

MFMailComposeViewController를 사용하여 내 앱의 이메일에 첨부 된 PDF를 이메일로 보내는 간단한 기능이 있습니다. PDF는 Event Core Data의 데이터로 채워집니다. 따라서 사용자는 일부 정보를 채우고 UITableView는 고유 한 이벤트로 구성됩니다. 사용자가 이벤트를 선택하면 전자 메일 단추가 NavigationBar에 표시되므로 이벤트 정보가 PDF에 추가 된 해당 이벤트에 대한 전자 메일을 보낼 수 있습니다.

- (IBAction)savePDFAndEmail:(id)sender 
{ 
    pageSize = CGSizeMake(612, 792); 
    NSString *string = self.occasion.title;  
    NSString *fileName = [NSString stringWithFormat:@"%@.pdf", resultString]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName]; 

    // NSMutableData *data = [NSMutableData dataWithContentsOfFile:pdfFileName]; 
    NSData *data=[NSData dataWithContentsOfFile:pdfFileName]; 
    [self createPDF:pdfFileName]; 

    NSLog(@"Data is %@", data); 

    if ([MFMailComposeViewController canSendMail]) 
    { 
     MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init]; 

     mailer.mailComposeDelegate = self; 
     [mailer setSubject:@"An email"]; 
     [mailer addAttachmentData:data mimeType:@"application/pdf" fileName:fileName]; 

     NSString *emailBody = @"Please find attached PDF"; 
     [mailer setMessageBody:emailBody isHTML:NO]; 

     [self presentViewController:mailer animated:YES completion:^{ 
      [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

     }]; 
    } 

} 

UPDATE :

여기 내 코드 년대 createPDF 방법은 다음과 같습니다

- (void)createPDF:(NSString *)fileName 
{ 
    CGContextRef pdfContext; 
    CFStringRef path; 
    CFURLRef url; 
    CGSize textSize = CGSizeMake(pageSize.width - 5*kBorderInset-5*kMarginInset, pageSize.height - 5*kBorderInset - 5*kMarginInset); 
    CGRect pageRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 50.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, textSize.height); 
    CFMutableDictionaryRef myDictionary = NULL; 
    const char *filename = [fileName UTF8String]; 

    // Create a CFString from the filename we provide to this method when we call it 
    path = CFStringCreateWithCString (NULL, filename, 
             kCFStringEncodingUTF8); 
    // Create a CFURL using the CFString we just defined 
    url = CFURLCreateWithFileSystemPath (NULL, path, 
             kCFURLPOSIXPathStyle, 0); 
    //CFRelease (path); 
    // This dictionary contains extra options mostly for 'signing' the PDF 
    myDictionary = CFDictionaryCreateMutable(NULL, 0, 
              &kCFTypeDictionaryKeyCallBacks, 
              &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, (__bridge_retained CFStringRef)fileName); 
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, (__bridge_retained CFStringRef)fileName); 

    // Create our PDF Context with the CFURL, the CGRect we provide, and the above defined dictionary 
    pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); 
... 

그것은 점점 그것은 PDF를 채우는 코어 데이터의 정보입니다.

이것은 매우 표준적인 코드입니다. 나는 PDF를 즉시 작성하고이 전자 메일에 첨부하고 스택 오버플로 (수백 개가 있음)와 관련된 다른 모든 문제와 마찬가지로 PDF는 전자 메일을 만들 때 전자 메일에 "첨부"됩니다. 그러나 이메일을 보낼 때 pdf가 첨부되어 있지 않습니다. 내 메일의 보낸 항목에는 이메일이 있지만 첨부 된 PDF는 없습니다. 앱으로 돌아가서 동일한 pdf를 다시 보내면 두 번째 이메일에 PDF가 포함됩니다.

데이터에 대한 NSLog는 모든 것을 보여줍니다.

새 이벤트가 생성되면 NSLog는 "Null"입니다. 이메일을 보내고 같은 이벤트로 돌아 가면 데이터는 일련의 숫자 (null이 아님)로 구성됩니다.

일부 중단 점을 넣었을 때 추적 한 결과 데이터가 null이지만 filePath도 처음으로 추가되지 않습니다.

이메일을 보내지 않아도됩니다. 단순히 MFMailComposeViewController를 활성화하고 취소를 눌러 기존 초안을 삭제 한 다음 다시 열면 데이터가 null이 아닙니다. 그것은 분명히 나쁜 UI입니다.

문제

문제는 단순히 PDF는 (데이터가 null) 이메일에 사용자가 선택한 이벤트에 대한 PDF를 전송 처음 부착되고 있지 않습니다 있다는 사실이다. 격주로 나타납니다.

이 문제에 대한 의견은 정말 감사하겠습니다.

+0

에 읽기, 만들기 : 그러나 코드에서 나는

는 당신이 그 두 줄을 전환 시도하십시오 수있는 다른 볼? – sage444

+0

해당 코드의 질문이 업데이트되었습니다. - 감사합니다. Sage444 – amitsbajaj

답변

1

논리적으로 pdf를 만든 다음 데이터를 읽고 메일에 첨부해야합니다. `방법 :

[self createPDF:pdfFileName]; 
NSData *data=[NSData dataWithContentsOfFile:pdfFileName]; 

먼저 PDF는 다음 NSData 당신이 createPDF`에 무엇을

+0

Oh man. 나는 그것을 놓쳤다는 것을 믿을 수 없다. @ sage444 - 엄청나게 우스꽝 스럽다. 내 단점에서도 그걸 골라야했기 때문에. 그냥 멀티 태스킹이 좋은 도구가 아닌지 보여줍니다.도움과 사과에 다시 한번 감사드립니다! – amitsbajaj