Перетаскивание не включено для NSOutlineView, хотя я реализовал методы делегата - PullRequest
4 голосов
/ 02 апреля 2012

Я не могу включить перетаскивание для NSOutlineView.Я реализовал связанный метод NSOutlineView Delegate.

Но кажется, что когда я щелкаю элемент, я даже не могу его перетащить (я не вижу анимацию).

- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id < NSDraggingInfo >)info item:(id)item childIndex:(NSInteger)index
{
    return YES;
}

- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id < NSDraggingInfo >)info proposedItem:(id)item proposedChildIndex:(NSInteger)index
{
    return NSDragOperationMove; //not sure about this one.
}

спасибо

ОБНОВЛЕНИЕ:

Я реализую для OSX> = 10,5

- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard
{
    NSString *pasteBoardType = [self pasteboardTypeForTableView:outlineView];
    [pboard declareTypes:[NSArray arrayWithObject:pasteBoardType] owner:self];

    NSData *rowData = [NSKeyedArchiver archivedDataWithRootObject:items];
    [pboard setData:rowData forType:pasteBoardType];
        return YES;
}

Ответы [ 2 ]

5 голосов
/ 02 апреля 2012

Методы, которые вы реализовали, предназначены только для назначения перетаскивания. Вам все еще нужно реализовать методы перетаскивания источника . По какой-либо причине в документации Apple NSOutlineViewDataSource отсутствуют эти методы, но у вас есть два варианта:

  1. Если вы собираете 10.7+, используйте команду Xcode Open Quickly, чтобы посмотреть в NSOutlineView.h и найти соответствующие методы. Также ознакомьтесь с примером приложения DragNDropOutlineView .

  2. Если вы поддерживаете предыдущие ОС, используйте методы делегирования 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 на обзор.

3 голосов
/ 02 апреля 2012

Чтобы сделать ваш контурный вид перетаскиваемым источником, вы должны реализовать:

- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard;

Это должно относиться к тому, что вы описали, но у вас впереди намного больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...