Ladevorgang von NSDocument abbrechen

  • Ladevorgang von NSDocument abbrechen

    Ich möchte dem User die Möglichkeit geben, den Ladevorgang abzubrechen.
    Dazu zeige in "- (BOOL) readFromFile: ofType" in meiner Dokumentenklasse ein Panel mit Abbruch-Button an.

    Als Reaktion auf das Drücken des Abbruch-Buttons mache die Notwendigen Aufräumarbeiten und springe dann aus der Methode mit "NO" 'raus.
    So weit so gut.

    Das Cocoa-Framework zeigt darauf hin eine Meldung an, dass mein Document nicht geladen werden konnte. Falls ein Document aus dem "Recent documents" menü aufgerufen wurde, wird der Eintrag zusätzlich aus dem Menü entfernt.

    Wie kann diese Meldung unterbinden (möglichst nur für den, Fall dass der Ladevorgang durch den Benutzer abgebrochen wurde und nicht im Falle ein echten Fehlers)?

    Danke,
    Tjark
  • RE: Ladevorgang von NSDocument abbrechen

    Ich glaube, da kommt du um nen override von ein paar NSDocument / NSDocumentController Funktionen nicht drumrum. Ich würde vorschlagen, du fängst mit NSDocument an und schaust mal, in welcher Reihenfolge die aufgerufen werden. Wenn du das hast überschreibst du die, die am einfachsten geht oder (wenn du das rausbekommen solltest) am besten die, wo das Sheet aufgerufen wird. Max
  • RE: Ladevorgang von NSDocument abbrechen

    Siehste, da fällt mir doch glatt noch ne wesentlich elegantere Lösung ein :)
    Wenn der user abbrechen macht, dass gibt die Funktion nicht NO, sondern YES zurück, schließt das dokument aber gleichzeitig. Das hat dann den Vorteil, dass du nichts groß überschreiben musst. Tipp: (fall es so weit kommen sollte) Mach das so, dass du noch ne BOOL in dein Dokument reinnimmst, das sagt, ob die datei geladen wurde. Damit könntest du dann Fehler vermeiden, wenn die Daten unvollständig oder nur halb da sind. Alternativ könntest du auch die globalen variablen, die den Spaß sichern leeren.

    -> 1000'e Möglichkeiten :D Und da sagt einer, dass Cocoa n kleines Framework sei *g*

    max
  • RE: Ladevorgang von NSDocument abbrechen

    Das Dokument kann ich aber doch erst dann wieder schließen, wenn der komplette Initialisierungsvorgang (in DocumentController und Application) abgeschlossen ist aber noch bevor das Fenster für das Dokument erzeugt wird, oder?
    Und das muss ich dann wahrscheinlich um DocumentController machen.

    Ich werde wohl erst mal nachforschen müssen, wo die Meldung angezeigt wird.
  • RE: Ladevorgang von NSDocument abbrechen

    Mach doch einfach in die WindowControllerDidLoadNib wieder gleich ne close-message oder so und/oder gibt als nib-namen nil zurück, wenn das laden nicht geklappt hat, dann kann da auch kein Fenster kommen.
  • Habe nach einigem 'rumprobieren eine Lösung gefunden, die auch gar nicht so aufwendig ist.
    Dazu muss in der eigenen NSDocumentController-Klasse nur "openDocument:" und die Delegate-Methode "application: openFile:" neu implementiert werden:
    (in meiner App können nur Ordner geöffnet werden, also nicht von den ersten 3 Zeilen in der Delegate-Methode irritieren lassen)

    Quellcode

    1. //"Open..." menu handler
    2. - (IBAction)openDocument:(id)sender
    3. {
    4. //we implement this method by ourself, se we can avoid that stupid message "document couldn't be opened"
    5. //in the case the user canceled the opening
    6. NSArray *fileNames = [self fileNamesFromRunningOpenPanel];
    7. if ( fileNames == nil )
    8. return; //cancel pressed
    9. NSEnumerator *enumerator = [fileNames objectEnumerator];
    10. NSString *fileName;
    11. while ( fileName = [enumerator nextObject] )
    12. {
    13. [self openDocumentWithContentsOfFile: fileName display: YES];
    14. }
    15. }
    16. //Application's delegate; called if file from recent list is selected
    17. - (BOOL) application: (NSApplication*) theApp openFile: (NSString*) fileName
    18. {
    19. //if "fileName" doesn't exist or isn't a folder, return NO so that it is removed from the recent list
    20. NSDictionary *attribs = [[NSFileManager defaultManager] fileAttributesAtPath: fileName traverseLink: NO];
    21. if ( attribs == nil || ![[attribs fileType] isEqualToString: NSFileTypeDirectory] )
    22. return NO;
    23. [self openDocumentWithContentsOfFile: fileName display: [self shouldCreateUI]];
    24. //return TRUE to avoid nasty message if user canceled loading
    25. return TRUE;
    26. }
    Alles anzeigen

    Diese Lösung ist eigentlich nicht so schön, weil die 2 Methoden komplett neu implementiert werden müssen, nur um die blöde Meldung zu unterdrücken. Anscheinend ist das Abbrechen des Ladevorgang in einer Standard-Document-Applikation in Cocoa nicht vorgesehen ;(
    (10.3 scheint für diesen Fall "- (void)replyToOpenOrPrint:(NSApplicationDelegateReply) reply" zu NSApplication hinzugefügt zu haben; diese nützt hier aber nicht viel, da die besagte Meldung in den beteiligten Methoden von NSDocumentController angezeigt wird).