Domanda

C'è tipologia di un file la mia domanda di importazione, ma non salva. Ho aggiunto una voce al tipi di documenti e impostato a sola lettura, ma che non produce il comportamento di importazione che sto cercando. Invece, la mia app sarà solo aprire il file e quando salvo il file originale viene sovrascritto nel mio formato di file.

Come impostare il mio tipo di documento o di documenti per fare in modo che un nuovo documento viene creato con i dati del documento originale, in luogo dell'originale che si apre?

È stato utile?

Soluzione

1. Dichiarare i tipi di file, come tipi di documento

all'interno del progetto Xcode, aggiungere un Tipo di documento per tutti i formati di file supportati dall'applicazione. Impostare il ruolo di ogni tipo in base alle capacità della vostra applicazione:

  • Mark lettura / scrittura tipi di file in grado di Editor ;
  • Mark importazione di file solo tipi come Visualizzatore .

Imposta Class per il tipo di documento che si desidera gestire ogni tipo di file. Una classe di documento in grado di gestire più tipi di file.

Nell'esempio qui sotto, ci sono tre tipi di file dichiarati: font-pestello, OTF, e TTF. Il primo, font-pestello, è il formato nativo dell'applicazione. Questo tipo ha il ruolo Editor .

I restanti due formati, sistema organizzato di negoziazione e TTF, possono essere importati, ma non scritti dall'applicazione; in tal modo essi sono contrassegnati come Visualizzatore .

Tipi Esempio Documento

2. Altri tipi di file nella sottoclasse NSDocument

Con i tipi di documento aggiunto, l'applicazione permetterà agli utenti di aprire automaticamente i file dei tipi specificati.

È necessario aggiungere il tipo di file codice di gestione alla classe documento. Nel caso ideale, aggiungere il codice ramificazione al metodo 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 // ...

}

Il self.fileURL = nil; è importante. Impostando fileURL a zero, si sta dicendo il documento non è associato a qualsiasi file sul disco e dovrebbe essere trattato come un nuovo documento.

Per consentire il salvataggio automatico, implementare il metodo autosavingFileType NSDocument per restituire il tipo di file primario.

Altri suggerimenti

Alex, grazie per la risposta, ma ho trovato un modo che mi piace un po 'di più:

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

In questo modo è ancora possibile utilizzare il sistema documentale fornita dal cacao al posto fo rotazione mia.

Ho anche documentato la soluzione qui: http://www.cocoadev.com/ index.pl?CFBundleTypeRole un po 'in basso nella pagina.

Non credo che la funzionalità di importazione è supportata di default in Cocoa. Quando l 'utente fa clic sul pulsante Apri nel pannello aperto, il framework chiama openDocumentWithContentsOfURL:display:error: sul NSDocumentController. Questo è dove il sistema documentale capisce che tipo di file che si sta aprendo e si consulta con il file Info.plist per capire quali sottoclasse NSDocument da utilizzare per aprire il documento.

Si potrebbe sottoclasse NSDocumentController e l'override del metodo openDocumentWithContentsOfURL:display:error: di intercettare i tipi di file che devono essere importati piuttosto che aperti. Nella sottoclasse NSDocument, scrivere un nuovo inizializzatore con un nome come initWithImportedContentsOfURL:type:error: (o qualcosa con un nome migliore :-)) per creare un nuovo documento senza titolo e leggere il contenuto del file importato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top