2009-08-18 15 views
0

Ich habe eine dokumentbasierte Anwendung, die eine XML-Datei formatiert.Überprüfen Sie vor dem Öffnen eines Dokuments in NSDocument-Architektur

Schreiben und Lesen von Dokumenten wird in meiner NSDocument Unterklasse getan

- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError 
- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError 

aber, wenn die Datei eine ungültige XML ist, ist meine App einfach abstürzt.

So implementiert I:

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename 
{ 
    if(safe){open new document using .....makeDocumentWithContentsOfURL:......} 
    else{present alert} 
} 

Aber es gibt viele offensichtliche Nebenwirkungen mit diesem. Ich habe einige andere Methoden außer Kraft zu setzen:

-(BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName  forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError 
{ 
    return [self writeToURL:absoluteURL ofType:typeName error:outError]; 
    //return YES; 
} 

Und das ist, wo der Strand-Ball Cursor erscheint und schließlich die Anwendung reagiert nicht mehr.

Gibt es eine bessere Möglichkeit, das Dokument vor dem Öffnen zu validieren?

Antwort

2

Sie sollten -readFromURL:ofType:error: so implementieren, dass es nicht auf schlechtem XML abstürzt. Dies ist die Routine, in der Sie Ihre Validierung durchführen sollten. Welcher Teil Ihres Codes verursacht den Absturz und welche Art von Absturz ist das?

In Bezug auf den Beachball in -writeSafelyToURL:ofType:forSaveOperation:error:, erstellen Sie wahrscheinlich eine Endlosschleife. Es ist möglich, dass -writeToURL:ofType:error:-writeSafelyToURL:.... ruft. In jedem Fall ist dies eine sehr seltsame Art, es zu überlasten. Was versuchst du hier zu erreichen? Ich verstehe nicht, wie sich das Überladen -application:openFile: entweder auf Ihr erstes Problem oder die Überladung bezieht, die Sie beschreiben.

+0

Dies ist, was ich früher getan hat, aber schlecht XML macht die App creash - (BOOL) readfromurl: (NSURL *) absoluteURL ofType: (NSString *) Typname Fehler: (NSError **) outError NSXMLDocument * xmlDoc = [[NSXMLDocument-Zuordnung] initWithXMLString: Zeichenfolge Optionen: NSXMLNodePreserveWhitespace Fehler: &err]; if (err) { Rückgabe NO; } sonst { etwas tun .. zurück JA; } } Ich weiß nicht, was mehr als das zu implementieren ... –

+0

Und was war der Absturz? –

+0

Rajesh: So behandeln Sie eine Fehlerrückgabe nicht. Testen Sie, ob 'xmlDoc'' nil' ist; * Nur wenn es "nil" ist, sollten Sie die Variable 'err' untersuchen. Bitte bearbeiten Sie das Crash-Log auch in Ihre Frage. –

1

Die beste Wette ruft dies in Ihrer Anwendung: openfile: Methode:

[[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&error]; 

verwenden, dass ich irgendwelche Probleme nicht gehabt haben (ich bin neu im Document Architecture als auch). Tun Sie einfach Ihre Validierung vor dieser Zeile und alles sollte funktionieren.

Eine andere Sache, die Sie nützlich finden könnten: Wenn Sie eine der NSDocument laden/speichern Methoden für verschiedene Typen überschreiben, sollten Sie die Super-Version von jedem am Ende aufrufen, wenn Sie nicht speichern/laden in ihnen . So können Sie zum Beispiel readFromData:ofType:error: für einen Dateityp haben, aber readFromFileWrapper:ofType:error: für einen anderen, und beide funktionieren automatisch so lange, wie Sie [super ...] am Ende von jedem aufrufen, wenn Sie den angeforderten Typ nicht behandeln.

+0

Whoa ... äh, habe gerade gemerkt, dass das ein ernsthafter Gravedig war ... Ich suchte nach etwas, sah das und antwortete darauf. Wie auch immer ... hoffe jemand findet es trotzdem nützlich. : D –

0

Warum nicht einfach den Return Code ??

Gerade von dem docs für readFromURL:ofType:error::

Rückgabewert
JA, wenn die Dokumentinhalte gelesen werden können; sonst, NEIN.

Verwandte Themen