Pregunta

Hay un tipo de archivo de importación mi solicitud, pero no salva. He añadido una entrada a los tipos de documentos y la ponga a sólo lectura, pero que no cede el comportamiento de importación que estoy buscando. En cambio, mi aplicación se acaba de abrir el archivo y al guardar el archivo original se sobrescribe en mi propio formato de archivo.

Cómo configurar mi documento o documentos tipos de hacerlo de modo que se crea un nuevo documento con los datos del documento original, en lugar del original que se abra?

¿Fue útil?

Solución

1. Declarar los tipos de archivos como los tipos de documento

Dentro de su proyecto Xcode, añadir un Tipo de documento para todos los formatos de archivo que admite su aplicación. Establecer el Función: de cada tipo de acuerdo con las capacidades de su aplicación:

  • Marcos de lectura / escritura tipos de archivos capaz como Editor ;
  • Marcos de importación únicamente los tipos de archivos como Visor .

Ajuste el Clase para el tipo de documento que desea manejar cada tipo de archivo. Una clase de documento puede manejar varios tipos de archivo.

En el siguiente ejemplo, hay tres tipos de archivos declararon: font-maja, OTF, y TTF. La primera, la fuente-pilón, es el formato nativo de la aplicación. Este tipo tiene la función Editor .

Los dos formatos restantes, OTF y TTF, se pueden importar, pero no están escritos por la aplicación; por lo que están marcados como Visor .

Tipos de ejemplo, el documento

2. tipos de archivos adicionales en su subclase NSDocument

Con los tipos de documentos añaden, la aplicación automáticamente permitirá a los usuarios abrir archivos de los tipos especificados.

Es necesario añadir código de control de tipo de archivo a su clase de documento. En el caso ideal, agregue el código de ramificación con el método readFromData:ofType:error::

- (BOOL)readFromData:(NSData*)someData ofType:(NSString*)typeName error:(NSError**)outError
{
    if ([NSWorkspace.sharedWorkspace type:@"eu.miln.font-pestle" conformsToType:typeName] == YES)
    {
        // read native format
    }
    else if ([NSWorkspace.sharedWorkspace type:@"public.opentype-font" conformsToType:typeName] == YES)
    {
        // read import only format

        // disassociate document from file; makes document "untitled"
        self.fileURL = nil;
        // associate with primary file type
        self.fileType = @"eu.miln.font-pestle";

    }
    else // ...

}

El self.fileURL = nil; es importante. Al establecer fileURL a cero, que está diciendo el documento no está asociado con ningún archivo en el disco y debe ser tratado como un documento nuevo.

Para permitir el guardado automático, poner en práctica el método NSDocument autosavingFileType para devolver el tipo de archivos principal.

Otros consejos

Alex, gracias por su respuesta, pero he encontrado una manera que me gusta un poco más:

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
               error:(NSError **)outError
{
    *outError = nil;
    if ([typeName isEqualToString:@"SomeReadOnlyType"])
    {
        // .. (load data here)
        [self setFileURL:nil];

        return result;
    }
    else
    {
        // .. (do whatever you do for other documents here)
    }
}

De esta manera es posible usar el sistema de documento proporcionado por cacao en lugar fo rodar mi propia.

También he documentado la solución aquí: http://www.cocoadev.com/ index.pl?CFBundleTypeRole un poco abajo de la página.

No creo que la funcionalidad de importación es compatible de forma predeterminada en el cacao. Cuando el usuario hace clic en el botón Abrir en el panel abierto, el marco llama openDocumentWithContentsOfURL:display:error: en NSDocumentController. Aquí es donde el sistema documento se da cuenta de qué tipo de archivo que está abriendo y consulta con el archivo Info.plist de averiguar qué subclase NSDocument utilizar para abrir el documento.

Se podría subclase NSDocumentController y reemplazar el método openDocumentWithContentsOfURL:display:error: para interceptar los tipos de archivos que deben ser importadas en lugar de abrirse. En la subclase NSDocument, escribir un nuevo inicializador con un nombre como initWithImportedContentsOfURL:type:error: (o algo con un nombre mejor :-)) para crear un nuevo documento sin título y leer en el contenido del archivo importado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top