Frage

Es gibt eine Datei meine Anwendung Import geben, aber nicht speichern. Ich habe einen Eintrag in die Dokumenttypen hinzugefügt und legen Sie es auf nur gelesen, aber das führt nicht zu dem Import Verhalten, das ich suche. Stattdessen wird meine app nur die Datei öffnen und wenn ich die ursprüngliche Datei zu speichern ist in meinem eigenen Dateiformat überschreibt.

Wie kann ich mein Dokument oder Dokumenttypen einrichten, um es zu machen, so dass ein neues Dokument mit den Daten aus dem Originaldokument erstellt wird, statt das Original geöffnet werden?

War es hilfreich?

Lösung

1. Deklarieren Sie die Dateitypen als Dokumenttypen

In Ihrem Xcode-Projekt, fügen Sie ein Dokumenttyp für alle Dateiformate Ihre Anwendung unterstützt. Stellen Sie die Rolle jeder Art entsprechend Ihrer Anwendung Fähigkeiten:

  • Mark Lesen / Schreiben der Lage Dateitypen als Editor ,
  • Mark Import nur Dateitypen als -Viewer .

Stellen Sie die Klasse , um den Dokumententyp Sie die einzelnen Dateitypen behandeln möchten. Eine Dokumentenklasse können mehrere Dateitypen verarbeiten.

Im Beispiel unten gibt es drei Dateitypen erklärt: font-Stößel, otf und ttf. Das erste, die font-Stößel, ist das native Format der Anwendung. Dieser Typ hat die Rolle Editor .

Die verbleibenden zwei Formate, otf und ttf, können importiert werden, aber nicht durch die Anwendung geschrieben; so werden sie markiert als -Viewer .

Beispiel Dokumenttypen

2. Weitere Dateitypen in Ihrer NSDocument Unterklasse

Mit den Dokumenttypen hinzugefügt, wird die Anwendung automatisch Benutzer erlaubt, Dateien des angegebenen Typs zu öffnen.

Sie müssen Dateityp Handhabung Code in Ihre Dokumentenklasse hinzuzufügen. Im Idealfall, fügen Sie den Verzweigungscode zur readFromData:ofType:error: Methode:

- (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 // ...

}

Die self.fileURL = nil; ist wichtig. Durch fileURL auf Null einstellen, sagen Sie das Dokument nicht mit einer On-Disk-Datei zugeordnet ist und soll als neues Dokument behandelt werden.

die automatischen Speicher ermöglichen, implementieren die NSDocument Methode autosavingFileType den primären Dateityp zurückzukehren.

Andere Tipps

Alex, vielen Dank für Ihre Antwort, aber ich fand einen Weg, dass Ich mag ein bisschen mehr:

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

Auf diese Weise ist es noch möglich, das Dokument System von Cocoa zu nutzen, anstatt mein eigenes fo rollen.

Ich habe auch die Lösung hier dokumentiert: http://www.cocoadev.com/ index.pl?CFBundleTypeRole ein wenig unten auf der Seite.

Ich glaube nicht, dass Import-Funktionalität standardmäßig in Cocoa unterstützt wird. Wenn der Benutzer auf die Schaltfläche Öffnen in der offenen Panel klickt, ruft das Framework openDocumentWithContentsOfURL:display:error: auf NSDocumentController. Dies ist, wo das Dokument System findet heraus, welche Art von Datei, die Sie öffnen und berät sich mit der Info.plist-Datei, die NSDocument Unterklasse, um herauszufinden, um das Dokument zu verwenden, um zu öffnen.

Sie könnten NSDocumentController Unterklasse und die openDocumentWithContentsOfURL:display:error: Methode überschreiben, die Dateitypen abfangen, die nicht geöffnet importiert werden sollen. In Ihrer NSDocument Unterklasse, schreiben Sie eine neue initializer mit einem Namen wie initWithImportedContentsOfURL:type:error: (oder etwas mit einem besseren Namen :-)) ein neues Dokument ohne Titel zu erstellen und in dem Inhalt der importierten Datei lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top