{"id":21,"date":"2005-07-29T05:44:00","date_gmt":"2005-07-29T09:44:00","guid":{"rendered":""},"modified":"2018-10-31T10:16:18","modified_gmt":"2018-10-31T17:16:18","slug":"drag-and-drop-in-an-nstableview","status":"publish","type":"post","link":"https:\/\/www.corbinstreehouse.com\/blog\/2005\/07\/drag-and-drop-in-an-nstableview\/","title":{"rendered":"Drag and Drop in an NSTableView"},"content":{"rendered":"<p id=\"top\" \/>\n<p>Drag and Drop in an NSTableView is easy to do. However, I think the documentation (<a href=\"file:\/\/\/Developer\/ADC%20Reference%20Library\/documentation\/Cocoa\/Conceptual\/TableView\/Tasks\/UsingDragAndDrop.html\" title=\"Table Views: Using Drag and Drop in Tables\">Table Views: Using Drag and Drop in Tables<\/a>) for it isn&#8217;t particularly great. It misses a few points, so I&#8217;m going to go over the basic steps on how to add drag and drop to your TableView. Here, I&#8217;ll assume you have a TableView with your source code controller class set as the delegate.<\/p>\n<p>Declare your custom pasteboard format:<\/p>\n<p class=\"p1\"><font face=\"Monaco\" size=\"2\" color=\"#683821\" class=\"f1\">#define BasicTableViewDragAndDropDataType @\u00e2\u20ac\u0153BasicTableViewDragAndDropDataType\u00e2\u20ac\u009d<\/font><\/p>\n<p>In awakeFromNib you must register for the drag types you want to receive (you could have others here):<\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">&#8211; (<\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">void<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">)awakeFromNib {<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span>[myTableView registerForDraggedTypes:[NSArray arrayWithObjects:BasicTableViewDragAndDropDataType, <\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">nil<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">]];<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">}<\/font><\/p>\n<p>Then, you must implement writeRowsWithIndexes to add your data to the pasteboard:<\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">&#8211; (<\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">BOOL<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard {<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span><\/font><font face=\"Monaco\" size=\"2\" color=\"#236e25\" style=\"font: 10.0px Monaco; color: #236e25\">\/\/ Drag and drop support<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span>NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span>[pboard declareTypes:[NSArray arrayWithObject:BasicTableViewDragAndDropDataType] owner:<\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">self<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">];<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span>[pboard setData:data forType:BasicTableViewDragAndDropDataType];<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span><\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">return<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"> <\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">YES<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">;<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">}<\/font><\/p>\n<p>Next you will validate the drop:<\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">&#8211; (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(<\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">id<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"> <nsdragginginfo>)info proposedRow:(<\/nsdragginginfo><\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">int<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">)row proposedDropOperation:(NSTableViewDropOperation)op {<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span><\/font><font face=\"Monaco\" size=\"2\" color=\"#236e25\" style=\"font: 10.0px Monaco; color: #236e25\">\/\/ Add code here to validate the drop<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span>NSLog(<\/font><font face=\"Monaco\" size=\"2\" color=\"#891315\" style=\"font: 10.0px Monaco; color: #891315\">@\u00e2\u20ac\u0153validate Drop\u00e2\u20ac\u009d<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">);<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span><\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">return<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"> NSDragOperationEvery; <span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0<\/span><\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">}<\/font><\/p>\n<p>Finally, you must have a method that accepts the drop. Here you could access the BasicTableViewDragAndDropDataType and look at the rows that were dragged.<\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">&#8211; (<\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">BOOL<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">)tableView:(NSTableView*)tv acceptDrop:(<\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">id<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"> <nsdragginginfo>)info row:(<\/nsdragginginfo><\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">int<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">)row dropOperation:(NSTableViewDropOperation)op {<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span>NSLog(<\/font><font face=\"Monaco\" size=\"2\" color=\"#891315\" style=\"font: 10.0px Monaco; color: #891315\">@\u00e2\u20ac\u0153acceptDrop\u00e2\u20ac\u009d<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">);<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span><\/font><font face=\"Monaco\" size=\"2\" color=\"#236e25\" style=\"font: 10.0px Monaco; color: #236e25\">\/\/ Add code here to accept the drop<\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 48.0px; text-indent: -48.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"><span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0 <\/span><\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">return<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\"> <\/font><font face=\"Monaco\" size=\"2\" color=\"#760f50\" style=\"font: 10.0px Monaco; color: #760f50\">YES<\/font><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">; <span class=\"Apple-converted-space\">\u00c2\u00a0 \u00c2\u00a0<\/span><\/font><\/p>\n<p style=\"margin: 0.0px 0.0px 0.0px 24.0px; text-indent: -24.0px\"><font face=\"Monaco\" size=\"2\" style=\"font: 10.0px Monaco\">}<\/font><\/p>\n<p>And that is it! It is pretty easy&#8230;<\/p>\n<p><!-- technorati tags start --><\/p>\n<p style=\"text-align:right;font-size:10px;\">Technorati Tags: <a href=\"http:\/\/www.technorati.com\/tag\/Cocoa\" rel=\"tag\">Cocoa<\/a><\/p>\n<p><!-- technorati tags end --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Drag and Drop in an NSTableView is easy to do. However, I think the documentation (Table Views: Using Drag and Drop in Tables) for it isn&#8217;t particularly great. It misses a few points, so I&#8217;m&#8230; <a class=\"read-more\" href=\"https:\/\/www.corbinstreehouse.com\/blog\/2005\/07\/drag-and-drop-in-an-nstableview\/\">[read more]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[6,1],"tags":[63,130,72],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-cocoa","category-general","tag-cocoa","tag-objc","tag-programming"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":1,"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":5337,"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions\/5337"}],"wp:attachment":[{"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.corbinstreehouse.com\/blog\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}