NSView, App Delegate und Drag&Drop support

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSView, App Delegate und Drag&Drop support

    Hallo zusammen,

    da ich jetzt ein MBP mit M1 habe, wollte ich meine alten Programme für den M1 fit machen (die meisten Dinge sind uralt Intel/PPC 32 Bit).
    Ein kleines Programm habe ich jetzt dabei noch um Drag&Drop (nur "Destination") erweitert, aber ich glaube, meine Lösung ist nicht wirklich elegant.

    Es handelt sich um ein relativ einfaches Projekt mit einem AppDelegate.m als zentrale Komponente (kein WindowController, DocumentController, oder ähnliches). In Xcode habe ich dann die Menüs, Fenster, usw. erstellt.
    Die Hierarchie bei dem Fenster ist dabei wie folgt

    Quellcode

    1. NSWindow
    2. >NSToolbar
    3. >NSView
    4. >>NSScrollView


    Jetzt wollte ich den NSView als "NSDraggingDestination" nutzen. Dazu habe ich dann eine eigene NSView-Klasse erzeugt und die "dragging-Methoden" implementiert.
    Nun empfängt die "performDrag…" Methode die URL von der Datei, die "gedropped" wurde:

    Quellcode

    1. - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    2. //NSLog(@"perform drag");
    3. NSURL *tempURL;
    4. tempURL = [NSURL URLFromPasteboard:[sender draggingPasteboard]];
    5. return YES;
    6. }

    Aber wie kann jetzt der View die URL an AppDelegate.m übergeben und das Laden der Datei triggern?

    In meiner aktuellen Lösung übergibt AppDelegate.m in "applicationDidFinishLaunching" sich selbst an den NSView, damit der View dann in "performDrag" die entsprechende Methode zum Laden der Datei aufrufen kann.
    Also sowas wie

    Quellcode

    1. //AppDelegate.m:
    2. [[self myView] setMyDelegate:self];
    3. //NSView
    4. [myDelegate openURL:tempURL];
    Aber das müsste doch einfacher gehen, oder?
    Und sollte ich nicht lieber den NSScrollView anstatt den NSView für Drag&Drop nutzen? Wenn ich z.B. eine optische Rückmeldung dabei geben möchte?

    Danke und Grüße
    Alex
    --
    Wer ist dieser Root und warum gehören ihm alle meine Dateien??

    SIDplay5 for macOS on GitHub
  • Hi Alex,

    zum einen brauchst Du den AppDelegate nicht - wie bei anderen Delegates - an die Klasse durchreichen, um dessen Methoden aufrufen zu können: Per NSApp kommst Du an die sharedApplication von NSApplication, und diese hat ein Property delegate: NSApp.delegate funktioniert also überall in der App.

    Die Dragging-Methode würde ich eigentlich in der documentView der ScrollView implementieren, welche ja den scrollbaren Inhalt repräsentiert und auf der das Drop erfolgt. Sie würde dann das Laden über den AppDelegate wie oben beschrieben aufrufen ... oder Du stellst auf eine "document-based App" um, dann kommt vieles quasi umsonst - aber das wäre bestimmt eine größere Anpassung.

    BTW, vor'm Verarbeiten von Pasteboard-Data empfiehlt Apple, den NSPasteboardType zu prüfen...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo Mattes,

    danke, NSApp hatte ich glatt vergessen. Das funktioniert jetzt wunderbar.
    Ich habe jetzt Drag&Drop für den ScrollView implementiert, das sieht auch gut aus.

    Und auch nochmal Danke für den Hinweis mit dem Pasteboard. Ich habe jetzt vor der Verwendung jeweils den Typ geprüft:

    Quellcode

    1. // check if pastebaord contains supported Pboardtype
    2. // if not, signal "no drag"
    3. if (![[sender draggingPasteboard] availableTypeFromArray:[NSArray arrayWithObject:NSURLPboardType]]) {
    4. return NO;
    5. }
    Grüße,
    Alex
    --
    Wer ist dieser Root und warum gehören ihm alle meine Dateien??

    SIDplay5 for macOS on GitHub