Document Based App & Dock Icon

  • Document Based App & Dock Icon

    Hallo, ich habe Probleme mit dem Drag & Drop auf das Dock Icon.

    Die Funktion hatte ich in einer früheren Version meines Programms schon integriert und funktionierte. Nun habe ich das Programm soweit umgeschrieben dass es eine Document Based App ist. Irgendwo klemmts noch mit der Zuordnung der Dateitypen. Normalerweise wird beim ersten Programmstart ein Leeres Dokument erstellt, in dieses kann ich mp3 oder m4a Dateien in eine Tableview laden. Das sollte eben auch gehen, wenn die Musikdateien aufs Dockicon gezogen werden.

    Zur Zeit ist es so, dass meine App zwar auf das Drag & Drop auf das Icon reagiert und versucht die Musikdateien zu öffnen, gibt mir aber die Fehlermeldung aus "The document “blabla.mp3” could not be opened. MyApp cannot open files in the “MPEG Audio Layer” format".

    Ich rufe den Dateiimport wie folgt auf.

    Quellcode

    1. - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
    2. {
    3. [myFileHandler addFiles:filenames atIndex:0];
    4. }

    und meine Einstellung der Target Properties wie auf dem Screenshot.

    Könnte da mal bitte jemand drüber schauen und sagen wo es eventuell klemmen könnte?

    Vielen Dank
  • Habe ich hinzugefügt. Aber ähnliches verhalten wie vorher. Jetzt habe ich heraus gefunden, wenn das Programm gestartet ist, dann lassen sich Dateien aufs Dockicon ziehen und diese werden auch geladen. Wenn das Programm noch nicht gestartet ist, kommt es zu besagten Fehlermeldungen. Ich nehme an, irgendwo fehlt die Einstellung, dass erst ein untitled document erstellt werden muss, bevor das eigentliche dateiladen beginnt?
  • Normalerweise macht das keinen Unterschied, weil Cocoa davon ausgeht, dass jede Datei, die aufs Icon geschoben wird, ein neues Dokument öffnet. In Deinem Fall ist das ja etwas anders, weil Du ja bei mp3s und m4as davon ausgehst, dass bereits ein Dokument offen ist (wenn ich es richtig verstanden habe). Ich würde ins Handling der mp3- oder m4a-Dateien eine Abfrage einbauen, die ein leeres Dokument öffnet, falls keins offen ist. Irgendwo müsstest Du ja schon eine Stelle haben, die das Dokument heraussucht, in das die Dateien rein sollen. Das wäre eine gute Stelle.
    Multigrad - 360°-Produktfotografie für den Mac
  • So, nun endlich hatte ich Zeit und bin voran gekommen. Folgendermaßen bin ich vor gegangen.

    Zuerst eine App Delegate klasse geschrieben:

    Quellcode

    1. @implementation MyAppDelegate
    2. - (id)init
    3. {
    4. if (self = [super init])
    5. {
    6. }
    7. return self;
    8. }
    9. - (void)awakeFromNib
    10. {
    11. [NSApp sendAction:@selector(newDocument:) to:nil from:self];
    12. }
    13. @end
    Alles anzeigen


    Diese habe ich in der MainMenu.xib instanziert und mit Application als Delegate verbunden.

    Wenn ich jetzt Mp3 Files auf das Dockicon ziehe wird ein leeres Dokument erstellt indem die MP3s geladen.
    Einziges Manko, zur Zeit öffnen sich zwei leere Dokumente wenn man die Dateien im Dock Icon dropped.

    Aber das kann man sicher geschickt abfragen.
  • Ich würd's einfach an einer anderen Stelle machen, in etwa so:

    Quellcode

    1. //im App-Delegate
    2. - (BOOL)application:(NSApplication*)app openFile:(NSString*)filename {
    3. if ([[NSApp orderedDocuments] count] < 1) {
    4. [[NSDocumentController sharedDocumentController] newDocument:self];
    5. }
    6. return NO; //oder anderes Zeig, was Du in der Methode noch erledigen willst
    7. }

    Die Methode hat zwei Vorteile: Erstens öffnet sie nicht das zweite leere Dokument und zweitens funktioniert sie auch, wenn jemand das Programm öffnet, alle Dokumentfenster schließt und dann etwas aufs Icon im Dock zieht.
    Multigrad - 360°-Produktfotografie für den Mac
  • Danke für den Codeschnippsel, aber diese Variante öffnet für jede Datei ein neues Document. Es wird ein Array mit Filenamen übergeben und diese Files kommen alle in ein einziges Dokument.
    Mit den ordered orderedDocuments kann ich aber die momentan geöffneten Dokumente abfangen, das hilft mir schon mal.

    Danke