1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Drag and Drop in NSTableView

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Zettt, 11.09.09.

  1. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hi,

    Das folgende ist eigentlich relativ trivial. Ich habe einen NSTableView der Daten aus einem NSMutableArray darstellt.
    Nun soll Drag and Drop der Listenelemente ermoeglicht werden. Also habe ich mir die Dokumentation geschnappt und die "Anleitung" unter "Using Drag and Drop in Tables" befolgt.

    Bis jetzt hatte ich keine Probleme nur den Drop zu akzeptieren macht mir Kopfweh. In der Anleitung steht.
    Code:
    // Move the specified row to its new location...
    Und genau da scheitere ich. ;)

    Ich krieg zwar das Objekt dazu das neue Objekt an der neuen Stelle hinzuschieben, aber von der alten Stelle zu entfernen da steigt mein Hirn irgendwie aus.
    Wie macht man das?

    Danke
     
  2. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
  3. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hey danke fuer die flotte Antwort. Ich habe nur ein Problem. Das was du da hattest hatte ich auch schon probiert. Nur das Problem war, dass die Objekte dann doppelt in der Liste stehen.

    Hier mal ein wenig Code aus dem acceptDrop:

    Code:
    NSPasteboard *pboard = [info draggingPasteboard];
    NSData *data = [pboard dataForType:MyDragType];
    NSIndexSet *indexSet = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    int dragRow = [indexSet firstIndex];
    
    [contentArray insertObject:[contentArray objectAtIndex:dragRow] atIndex:row];
    [contentArray removeObjectAtIndex:dragRow];
    
    [tableView reloadData];
     
  4. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Hier mein Code aus dem Projekt:

    Der funktioniert tadellos.
    Funktioniert auch, wenn Du zwischen den markierten Zeilen etwas einfügst.
    Also die richtige Folge.


    Viele Grüße
     
  5. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Gut, dasss Du mich erinnerst.
    Der Code ist plöht, schreibe ich neu.

    Ich schreibe ein Testprojekt.
    Lade es dann hier hoch.

    Viele Grüße
     
  6. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Ich schaffe es jetzt leider zeitlich nicht das Teil jetzt neu zu schreiben, aber ich habe Dir ein Beispiel erstellt.
    Bitte schreibe doch noch den Code beim Loslassen neu.

    Viele Grüße
     

    Anhänge:

    Zettt gefällt das.
  7. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hey ich danke dir fuer das Beispielprojekt. Das hat mir extrem viel weiter geholfen.
    Ich habs erstmal so gemacht wie du. Bin dann drauf gekommen, dass es vielleicht auch einfacher gehen koennte. (Da du, glaub ich, das Objekt was verschoben werden soll erst nochmal in ein tmpArray einliest, aber das Objekt befindet sich ja schon im Pasteboard.)

    Herausgekommen ist das hier:

    Code:
    - (BOOL)tableView:(NSTableView *)aTableView 
    	   acceptDrop:(id <NSDraggingInfo>)info 
    			  row:(NSInteger)destinationRow 
    	dropOperation:(NSTableViewDropOperation)operation {
    	//NSLog(@"%@", NSStringFromSelector(_cmd));
    	
    	NSPasteboard *pboard = [info draggingPasteboard];
    	NSData *data = [pboard dataForType:MyDragType];
    	NSIndexSet *indexSet = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    	int sourceRow = [indexSet firstIndex];
    	
    	if (destinationRow < sourceRow) { //drag nach oben
    		NSLog(@"Nach Oben");
    		
    		[contentArray insertObject:[contentArray objectAtIndex:sourceRow] atIndex:destinationRow];
    		[contentArray removeObjectAtIndex:sourceRow + 1];
    		
    	} else if ( destinationRow > sourceRow) { //drag nach unten
    		
    		[contentArray insertObject:[contentArray objectAtIndex:sourceRow] atIndex:destinationRow];
    		[contentArray removeObjectAtIndex:sourceRow];
    	}
    	[tableView reloadData];
    	
    	return YES;
    }
    
    In validateDrop arbeite ich auch ein wenig anders, allerdings kann ich nicht sagen ob das so stimmt. Ich moechte auch nicht, dass man Objekte "aufeinander" ziehen kann also:

    Code:
    - (NSDragOperation)tableView:(NSTableView *)aTableView 
    				validateDrop:(id < NSDraggingInfo >)info 
    				 proposedRow:(NSInteger)row 
    	   proposedDropOperation:(NSTableViewDropOperation)operation {
    
    	if (operation == 0) {
    		return NSDragOperationNone;
    	}
    	return NSDragOperationEvery;
    }
    
    Merci und herzlichsten Dank!
     
  8. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Ja, weil ich (in meinem richtigen Projekt) noch ein paar andere Dinge damit umsetzen muss.
    Deshalb dieser Weg.

    Schön, dass es Dir geholfen hat.

    Viele Grüße
     
  9. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Verstehe. Ok. Nein hat mir sehr geholfen. Danke.
     
  10. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Eine Frage noch. Wo fuehre ich denn die Drag'n'Drop Dinge die hier besprochen wurden in einer CoreData Applikation aus?
    Ist das am besten im Delegate aufgehoben oder kreiere ich dafuer lieber eine Subklasse von NSObject und rede darin mit dem eigentlich CoreData Zeugs?
    Steh grad mal wieder voll auf dem Schlauch.
     
  11. Thaddäus

    Thaddäus Golden Noble

    Dabei seit:
    27.03.08
    Beiträge:
    15.163
    Hi...

    Wäre super, wenn du nächstes Mal Codetags verwenden würdest, das verhindert, dass überall Smilies angezeigt werden... ;)
     
  12. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Wird er sicher noch machen. Hat mich jetzt aber auch nicht gestoert. Man weiss ja, was da eigentlich stehen soll.
     
  13. Thaddäus

    Thaddäus Golden Noble

    Dabei seit:
    27.03.08
    Beiträge:
    15.163
    Naja, trotzdem für irgendwas gibt es ja die Codetags... ;)
     
  14. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Das mit "wohin soll's" war ne doofe Frage. Natuerlich gehoert's in Controller. Da stand ich kurzzeitig auf der extrem langen Leitung. :p
     
  15. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Es ist bereits äußerst begrüßenswert, dass du zu den Leuten gehörst, die diese Frage stellen.
     
  16. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Bei little_pixel bin ich mir ziemlich sicher, dass es ein versehen war. Er gehört nämlich zu den hilfsbreitesten und qualifiziertesten Nutzern hier.
     
  17. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Danke, Amin. Was man so aus Jux und Dallerei nicht alles macht.

    Seh grade, dass du dieses Jahr auch wieder auf der Macoun bist. Da sehen wir uns ja. Kommst du Freitag schon? (Oder Samstag kurz vor Schluss – so wie dein Vortrag. Was fuer einen Slot du da erwischt hast!)
     

Diese Seite empfehlen