2012-08-26 9 views
9

Ich mache eine dokumentbasierte Cocoa-App, in der das Dokument eine Sammlung von Dateien dynamisch ist (Benutzer können Dateien hinzufügen oder entfernen). Insbesondere sollten die Operationen Speichern und Öffnen so schnell wie möglich sein. Wenn ich die Dokumentation richtig verstehe, sollte ich NSFileWrapper verwenden und fileWrapperOfType:error und readFromFileWrapper:ofType:error: implementieren. Ich kann jedoch kein vollständiges Codebeispiel finden. Wie sollte ich die folgenden Methoden implementieren?Verwenden von NSFileWrapper in NSDocument aus verschiedenen Dateien

#pragma mark - NSDocument 

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError { 
    return nil; 
} 

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError **)outError { 
    return YES; 
} 

#pragma mark - My methods 

- (void) addFileToDocumentFromURL:(NSURL*)fileURL { 
    // Add a file to the document given the file URL 
} 

- (void) removeFileFromDocumentWithName:(NSString*)name { 
    // Remove a file from the document given the file name 
} 

Antwort

10

Die Zusammen bits und pieces aus der Dokumentation:

- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { 
    return self.documentFileWrapper; 
} 

- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { 
    self.documentFileWrapper = fileWrapper; 
    return YES; 
} 

- (void) addFileToDocumentFromURL:(NSURL*)fileURL { 
    NSData* fileData = [NSData dataWithContentsOfURL:fileURL]; 
    NSFileWrapper *fileWrapper = [[NSFileWrapper alloc] initRegularFileWithContents:fileData]; 
    fileWrapper.preferredFilename = [fileURL lastPathComponent]; 
    [self.documentFileWrapper addFileWrapper:fileWrapper]; 
    [self updateChangeCount:NSChangeDone]; 
} 

- (void) removeFileFromDocumentWithName:(NSString*)name { 
    NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:name]; 
    if (fileWrapper) { 
     [self.documentFileWrapper removeFileWrapper:fileWrapper]; 
     [self updateChangeCount:NSChangeDone]; 
    } 
} 

- (NSFileWrapper*) documentFileWrapper { 
    if (!_documentFileWrapper) { // New document 
     _documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil]; 
    } 
    return _documentFileWrapper; 
} 
Verwandte Themen