2011-04-14 15 views
8

Pido disculpas si este argumento ya ha sido cubierto, pero después de algunas investigaciones no encontré nada preciso.NSDocument para contener una carpeta completa?

Necesito hacer una aplicación basada en documentos, donde el documento no es realmente un solo archivo sino una colección estructurada de archivos, en un directorio. Las ventanas mostrarán un pdf contenido en la carpeta, con un nombre de archivo específico, y lo enriquecerán con información de los otros archivos en la carpeta. No puedo usar anotaciones en pdf para lograr esto, realmente necesito mantener los archivos separados del pdf.

¿Cuál es el mejor enfoque para lograr esto? Todo el código de muestra que encontré usa un solo archivo.

Respuesta

12

Puede usar NSFileWrapper como un directorio de paquetes en aplicaciones basadas en documentos.

En su archivo de aplicación Info.plist, indique que su tipo de documento es un paquete o conjunto (clave LSTypeIsPackage con el valor YES).

En su subclase NSDocument, implemente los siguientes métodos para leer y escribir. En este ejemplo, asumo que las variables de instancia del modelo correspondientes son pdfData y signatureBitmapData, que se almacenan en el directorio del paquete bajo MainDocument.pdf y SignatureBitmap.png, respectivamente.

- (BOOL)readFromFileWrapper:(NSFileWrapper *)dirWrapper 
        ofType:(NSString *)typeName 
         error:(NSError **)outError 
{ 

    NSFileWrapper *wrapper; 
    NSData *data; 

    wrapper = [[dirWrapper fileWrappers] objectForKey:@"MainDocument.pdf"]; 
    data = [wrapper regularFileContents]; 
    self.pdfData = data; 

    wrapper = [[dirWrapper fileWrappers] objectForKey:@"SignatureBitmap.png"]; 
    data = [wrapper regularFileContents]; 
    self.signatureBitmapData = data; 

    … 

    return YES; 
} 

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName 
           error:(NSError **)outError 
{ 
    NSFileWrapper *dirWrapper = [[[NSFileWrapper alloc] 
     initDirectoryWithFileWrappers:nil] autorelease]; 

    [dirWrapper addRegularFileWithContents:self.pdfData 
     preferredFilename:@"MainDocument.pdf"]; 

    [dirWrapper addRegularFileWithContents:self.signatureBitmapData 
     preferredFilename:@"SignatureBitmap.png"]; 

    … 

    return dirWrapper; 
} 

Desde la perspectiva del usuario, el directorio del paquete aparece en Finder como si se tratara de un solo archivo, al igual que los directorios de Xcode .xcodeproj o paquetes de aplicaciones.

+0

Gracias por la respuesta detallada, intentaré esto inmediatamente. – hariseldon78

+0

@ hariseldon78 Saludos. Solo un comentario: no he incluido la verificación de errores y la generación de informes en mi ejemplo, pero debe hacerlo en su código de producción. –

+0

¿Sería posible abrir MainDocument.pdf sin especificar LSTypeIsPackage y simplemente guardar el documento junto con el archivo de imagen utilizando la API NSFileWrapper? –

Cuestiones relacionadas