NSTableView view-based drag & drop

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

  • NSTableView view-based drag & drop

    Hallo,

    ich habe ein view-based NStableView mit einer Spalte. Jeder Cell-View, Custom NSTableCellView, stellt eine Paarung 'n' dar und zeigt zwei Text-Fields mit 'An' und 'Bn'.
    Nun möchte ich
    • 'An' mit 'Bn' vertauschen
    • 'An' mit 'An-1' oder 'Bn' mit 'An+5' vertauschen (also ein Teil der Paarung mit einem anderen Teil einer anderen Paarung austauschen)


    und beides via Drag&Drop.

    Austauschen der Paarungen in Table-View wird vom NSTableView Delegate und Datasource erledigt.

    Wie kann ich Änderungen der Paarungen realisieren?
    Danke für Eure vorschläge.
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.
  • Du möchtest also nicht komplette Cells in einem NSTableView per Drag & Drop verschieben, sondern einzelne Felder innerhalb einer Cell, richtig?

    Dann schau Dir mal die Drag and Drop Programming Topics an. Ggf. musst Du anstelle der NSTextField eigene Custom Views verwenden, da NSTextField schon Drag & Drop für den Text unterstützt. Evtl. kollidiert dies dann mit Deiner Drag & Drop Implementierung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • Eigentlich will ich beides erreichen. Ganze Cells verschieben oder einzelne Felder zwischen den Cell.
    Verschieben einzelner Felder könnte ich, zum Beispiel, über ALT-Drag erkennen.

    Komisch ist auch, dass ich eine Deprecated Method im DataSource des Table-View implementieren muss. Wenn nur
    • tableView:draggingSession:willBeginAtPoint:forRowIndexes:


    implementiert ist, startet kein Dragging, Wenn ich dagegen
    • tableView:writeRowsWithIndexes:toPasteboard:


    implementiere, started das Dragging der Table-View.

    Drag einzelne Felder zwischen den Cells ist kniffelig.
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.
  • Wie willst du denn überhaupt erkennen, ob eine Row hoch/runter oder nur ein Textfeld re/li verschoben werden soll? Das müßtest du schon beim Start vom Drag wissen, damit du dann es entweder der Tableview überläßt (drag rows) oder selbst machst (re/li). Du müßtest dafür verschiedene Angriffsbereiche im der Row haben, an denen das festgemacht ist.

    Ich würde ja eher dazu tendieren, das dann nicht mit einer TableView sondern einer CollectionView oder gleich ganz selbst in einer ScrollView zu machen. Da hat man dann volle Kontrolle über das Dragging.
    Apps: apps.tempel.org (Find Any File, iBored, iClip, Prefs Editor)
    Blog: http://blog.tempel.org
    Über mich: tempel.org/AboutThomasTempelmann
  • Die CollectionView ist für zweidimensionale Felder, während TableView eindimensional (eine Liste) ist.

    Mit der CW kannst du dann festlegen, daß du immer genau 2 Spalten haben möchtest, d.h. es werden dann zwei Views nebeneinander erscheinen, und die nächsten dann darunter gereiht.
    Der Vorteil ist, daß du nun jeden View dragbar machen kannst. Wenn der User dann einen der beiden hoch/runterdraggt, kannst du im Code ja einfach beide kombinieren und dann zusammen verschieben, wenn du erkennst, daß vertikal verschoben wird.

    Oder vielleicht verstehe ich auch überhaupt nicht, was du für ein Layout hast - ich bin nicht gar klar aus Deiner Beschreibung geworden. Ein Bild sagt mehr als 1000 Worte :)
    Apps: apps.tempel.org (Find Any File, iBored, iClip, Prefs Editor)
    Blog: http://blog.tempel.org
    Über mich: tempel.org/AboutThomasTempelmann
  • So habe ich den View für den Table-View gestaltet.


    Wird in den Hintergrund geklickt und gedragged soll ganzer View verschoben werden, wird in A oder B geklickt, soll nur das dahinterliegende Object gedragged werden.
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.
  • C-Quellcode

    1. - (void)mouseDown:(NSEvent *)event
    2. {
    3. if ((event.type != NSLeftMouseDown) || (event.clickCount != 1)) {
    4. [[self nextResponder] mouseDown:event];
    5. } else while (1) {
    6. NSEvent *nextEvent = [[self window] nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask];
    7. switch ([nextEvent type]) {
    8. case NSLeftMouseDragged:
    9. // hier den drag behandeln
    10. return;
    11. case NSLeftMouseUp:
    12. return;
    13. default:
    14. continue;
    15. }
    16. }
    17. }
    Alles anzeigen
    Das geht z.B. per [NSView beginDraggingSessionWithEvent:]

    Google das ggf. mal, da sollten sich genug Bsp finden lassen.

    In Kürze: Du machst ne NSView-Subclass, die impl das Prot <NSDraggingSource>

    Dann mousedrags erkennen, z.B: ... ugh, jetzt wurde der Bsp-Code oben eingefügt - inline geht hier wohl nicht.
    Apps: apps.tempel.org (Find Any File, iBored, iClip, Prefs Editor)
    Blog: http://blog.tempel.org
    Über mich: tempel.org/AboutThomasTempelmann