2015-10-14 3 views
2

У меня есть этот метод, который создает PDF-файл и URL-адрес для PDF-файла. Моя проблема заключается в том, что я пытаюсь вернуть NSData PDF, но когда я пытаюсь в конце метода, он возвращает nil. Почему он возвращает нуль? Как я могу это исправить?Objective-C NSData возвращает nil

- (NSData *) setProductionSchedulePDF 
{ 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *filename = @"test.pdf"; 
    NSURL *fileURL = [NSURL fileURLWithPathComponents:[NSArray arrayWithObjects:documentsDirectory, filename, nil]]; 

    CGContextRef pdfContext = CGPDFContextCreateWithURL((CFURLRef)fileURL, NULL, NULL); 
    CGPDFContextBeginPage(pdfContext, NULL); 
    UIGraphicsPushContext(pdfContext); 

    CGRect bounds = CGContextGetClipBoundingBox(pdfContext); 
    CGContextScaleCTM(pdfContext, 1.0, -1.0); 
    CGContextTranslateCTM(pdfContext, 0.0, -bounds.size.height); 

    NSArray *taskArray = self.taskData; 

    UIFont *headerFont = [UIFont fontWithName:@"Arial" size:8]; 

    UIFont *font = [UIFont fontWithName:@"Arial" size:6]; 

    NSDictionary *attributes = @{ NSFontAttributeName: font}; 

    NSDictionary *headerAttributes = @{ NSFontAttributeName: headerFont}; 

    [@"Task" drawAtPoint:CGPointMake(10, 10) withAttributes:headerAttributes]; 

    int counter = 0; 
    for (id object in taskArray) { 
     [object drawAtPoint:CGPointMake(10, 10.5 * counter + 30) withAttributes:attributes]; 
     counter++; 
    } 

    int keyCounter = 0; 
    for(id object in self.prodSchedSortedKeys) { 
     [object drawAtPoint:CGPointMake(60 * keyCounter + 90, 10) withAttributes:headerAttributes]; 
     NSArray *bfsmArray; 

     if([finalProductionSchedule count]!=0) 
     { 
      bfsmArray = [finalProductionSchedule valueForKey:object]; 
     } 
     else 
     { 
      bfsmArray = nil; 
     } 

     bfsmArray = nil; 

     int valueCounter = 0; 
     for(id object2 in bfsmArray) 
     { 
      if(bfsmArray != nil) 
      { 

       if(valueCounter == 13 || valueCounter == 66 || valueCounter == 67){ 

        [[bfsmArray objectAtIndex:valueCounter] drawAtPoint:CGPointMake(60 * keyCounter + 90, 10.5 * valueCounter + 30) withAttributes:attributes]; 

       } 
       else if (valueCounter == 68 || valueCounter == 69) 
       { 
        [[[bfsmArray objectAtIndex:valueCounter] baseLineStart] drawAtPoint:CGPointMake(60 * keyCounter + 90, 10.5 * valueCounter + 30) withAttributes:attributes]; 
       } 
       else 
       { 
        if([[[bfsmArray objectAtIndex:valueCounter] baseLineStart] isEqualToString:@""] && [[[bfsmArray objectAtIndex:valueCounter] actualFinish] isEqualToString:@""]){ 

        } 
        else 
        { 
         [[NSString stringWithFormat:@"%@/%@",[[bfsmArray objectAtIndex:valueCounter] baseLineStart],[[bfsmArray objectAtIndex:valueCounter] actualFinish]] drawAtPoint:CGPointMake(60 * keyCounter + 90, 10.5 * valueCounter + 30) withAttributes:attributes]; 
        } 
       } 

      } 
      NSLog(@"%@", object2); 
      valueCounter++; 
     } 
     keyCounter++; 
    } 

    UIGraphicsPopContext(); 
    CGPDFContextEndPage(pdfContext); 
    CGPDFContextClose(pdfContext); 

    NSString *myString = [fileURL absoluteString]; 

    NSData *pdfData = [NSData dataWithContentsOfFile:myString]; 

    return pdfData; 
} 

UPDATE

Я добавил NSError так:

NSError *error; 
    NSData *pdfData = [NSData dataWithContentsOfFile:myString options:nil error:&error]; 

    NSLog(@"%@", error); 

и NSError возвращает следующее:

error NSError * domain: @"NSCocoaErrorDomain" - code: 260 0x16820310 

Вот лог консоли ошибки:

Error Domain=NSCocoaErrorDomain Code=260 "The file “test.pdf” couldn’t be opened because there is no such file." UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/A2C316BA-97DF-4560-8F6D-BA6A15B2CCA3/Documents/test.pdf, NSUnderlyingError=0x155420e0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}} 
+2

Имеет ли файл файл 'файлURL'? Примечание: должно быть лучшее имя для абсолютного URL-адреса файла, чем: 'myString'. – zaph

+3

Как насчет использования 'dataWithContentsOfFile: options: error:' версии вызова, чтобы вы могли видеть, что такое ошибка? –

+0

Вы пробовали отлаживать любую часть этого? Что такое 'файлURL'? Он существует? –

ответ

4

Изменение:

NSString *myString = [fileURL absoluteString]; 

To:

NSString *myString = [fileURL path]; 

Причина в том, [NSData dataWithContentsOfFile:] ожидать пути, то есть /some/dir/file.pdf. absoluteString возвращает URL-адрес, то есть: file://some/dir/file.pdf.

Подробнее об отличиях между path и absoluteString в этом question.

+0

это исправлено моей проблемой – user979331

Смежные вопросы