Методы, которые вы реализовали, предназначены только для назначения перетаскивания. Вам все еще нужно реализовать методы перетаскивания источника . По какой-либо причине в документации Apple NSOutlineViewDataSource отсутствуют эти методы, но у вас есть два варианта:
Если вы собираете 10.7+, используйте команду Xcode Open Quickly, чтобы посмотреть в NSOutlineView.h и найти соответствующие методы. Также ознакомьтесь с примером приложения DragNDropOutlineView .
Если вы поддерживаете предыдущие ОС, используйте методы делегирования NSTableView. См. Справочник по протоколу NSTableViewDataSource . Помните, что NSOutlineView является подклассом NSTableView и может использовать методы табличного представления.
Как минимум, вы, вероятно, захотите реализовать outlineView:writeItems:toPasteboard:
/* Dragging Source Support - Optional for single-image dragging. This method is called after
it has been determined that a drag should begin, but before the drag has been started. To
refuse the drag, return NO. To start a drag, return YES and place the drag data onto the
pasteboard (data, owner, etc...). The drag image and other drag related information will
be set up and provided by the outline view once this call returns with YES. The items array
is the list of items that will be participating in the drag.
*/
- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard;
Обновление:
Если предмет можно перетащить, но ни на что не уронить, то, скорее всего, outlineView:validateDrop:proposedItem:proposedChildIndex:
не вызывается. Это будет означать, что вы не зарегистрировали тип картона, который вы делаете с registerForDraggedTypes:
. Вы бы сделали это где-нибудь в контроллере вида, вероятно, в awakeFromNib
.
[outlineView registerForDraggedTypes:[NSArray arrayWithObject:@"myPasteBoardType"]];
Чтобы переместить элемент (и все его дочерние элементы), измените вашу модель на outlineView:acceptDrop:item:childIndex:
. Затем отправьте reloadData
на обзор.