NSOutlineView Drag-n-Drop

В моем приложении NSOutlineView используется, как показано ниже: 1 - Использование CustomOutlineView, потому что я хочу управлять фоном NSOutlineView,

2 - Использование CustomeCell, потому что мне нужно настроить Cell

Заголовочный файл: MyListView.h

/* 
 MyUICustomView is the Subclass from NSView and this is i need to have 
 for some other my application purpose 
*/
@interface MyListView : MyUICustomView<NSOutlineViewDataSource> 
{
      // MyCustomOutlineview because, i need to override DrawRect Method to have   
      //   customized background 
      MyCustomOutlineView *pMyOutlineView;

}

@property(nonatomic,retain)MyCustomOutlineView *pMyOutlineView;

а также я должен иметь возможность перетаскивать в режиме Outline, для перетаскивания я сделал следующее:

  -(void)InitOutlineView{
        // Creating outline view 
        NSRect          scrollFrame = [self bounds];
    NSScrollView*   scrollView  = [[[NSScrollView alloc] initWithFrame:scrollFrame] autorelease];

    [scrollView setBorderType:NSNoBorder];
    [scrollView setHasVerticalScroller:YES];
    [scrollView setHasHorizontalScroller:NO];
    [scrollView setAutohidesScrollers:YES];
    [scrollView setDrawsBackground: NO];

    NSRect          clipViewBounds  = [[scrollView contentView] bounds];
    pMyOutlineView       = [[[MyCustomOutlineView alloc] initWithFrame:clipViewBounds] autorelease];


    NSTableColumn*  firstColumn     = [[[NSTableColumn alloc] initWithIdentifier:@"firstColumn"] autorelease];
#ifdef ENABLE_CUSTOM_CELL
        // Becuase cell should have Image, Header Info and brief detail in small font, 
        // so i need to have custom cell 
    ImageTextCell *pCell = [[ImageTextCell alloc]init];
    [firstColumn setDataCell:pCell];
        // SO i can fill the data 
    [pCell setDataDelegate:self];
# endif

        [pMyOutlineView setDataSource:self];
        /* This is to tell MyCustomOutlineView to handle the context menu */
    [pMyOutlineView setDataDelegate:self];
        [scrollView setDocumentView:pCTOutlineView];

        [pMyOutlineView  addTableColumn:firstColumn];
        [pMyOutlineView registerForDraggedTypes:
         [NSArray arrayWithObjects:OutlinePrivateTableViewDataType,nil]];

        [pMyOutlineView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];**

    }

и для поддержки перетаскивания. Реализован следующий метод.

        - (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard{
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:items];
        [pboard declareTypes:[NSArray arrayWithObject:OutlinePrivateTableViewDataType] owner:self];
        [pboard setData:data forType:OutlinePrivateTableViewDataType];
        return YES;

    }


    - (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id < NSDraggingInfo >)info proposedItem:(id)item proposedChildIndex:(NSInteger)index{
    // Add code here to validate the drop

    NSLog(@"validate Drop");
    return NSDragOperationEvery;
}

        - (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id < NSDraggingInfo >)info item:(id)item childIndex:(NSInteger)index{
          NSLog(@"validate Drop");
    }

но все же, когда я пытаюсь перетащить строку NSOutlineView, ничего не происходит, даже я пытался выполнить отладку через NSLog, но я не видел никакого журнала из приведенной выше функции. Мне не хватает какого-либо важного метода? для поддержки Drag-n-drop


person Amitg2k12    schedule 31.01.2011    source источник
comment
Код, который вы не опубликовали, - это именно тот код, который нам нужно увидеть. Мы не можем помочь вам исправить код перетаскивания, если вы его не публикуете. Подсказка: метод ... writeRows ... - это минимум, необходимый для успешного начала перетаскивания.   -  person Joshua Nozzi    schedule 31.01.2011
comment
Привет, Джошуа, я загружу код, но WriteRow мне также нужно реализовать для outlineView, потому что я видел прототип, его только для TableView   -  person Amitg2k12    schedule 31.01.2011
comment
@Joshua, добавили код для метода, моя проблема в том, что точка останова даже не попадает ни в один из этих методов, поэтому я предполагаю, что мне не хватает какого-то метода делегата импорта, PN: мне нужно поддерживать Drag-n-Drop с контуром Посмотреть   -  person Amitg2k12    schedule 31.01.2011
comment
... writeItems ... правильно, это была моя ошибка (назвал эквивалент табличного представления).   -  person Joshua Nozzi    schedule 31.01.2011


Ответы (2)


Судя по вашему коду, похоже, что вы ничего не возвращаете для метода ... writeItems ... Этот метод должен возвращать BOOL (независимо от того, были ли элементы успешно записаны или вы отказываетесь от перетаскивания). Ничего не возвращая, вы должны предупреждать компилятор ...

person Joshua Nozzi    schedule 31.01.2011
comment
@Joshua, [pMyOutlineView setDataSource: self] уже добавлен, это то, что вы тоже имеете в виду, кроме того, в мой интерфейс приходят другие методы dataSource, такие как setObjectValue и т. Д., Кроме drag-n-drop :( - person Amitg2k12; 31.01.2011
comment
Хммм ... хорошо. Я еще раз взглянул на опубликованный вами код и обновил свой ответ. Код, который вы вставили, завершен? - person Joshua Nozzi; 31.01.2011
comment
@Joshua, Спасибо, я обновил весь необходимый код, а также у меня есть некоторый метод источника данных для заполнения данных, если я обновлю и его, но связанные с Drag-n-Drop завершены. - person Amitg2k12; 01.02.2011
comment
@ Джошуа, все равно это не сработало, не могли бы вы пролить еще немного света - person Amitg2k12; 03.02.2011
comment
Что происходит, когда вы используете стандартную ячейку вместо той, которая у вас есть? Замените его обычным NSTextFieldCell (вам нужно будет закомментировать любое место, где вы устанавливаете свойства настраиваемой ячейки) и посмотрите, можно ли таким образом инициировать перетаскивание. - person Joshua Nozzi; 03.02.2011

Привет, наконец-то удалось от этого избавиться. Проблема в том, что

[firstColumn setWidth:25];

Таким образом, перетаскивание работало только до 25 пикселей слева, и я прокомментировал это, затем его рабочее время, но странно видеть, что в моем представлении схемы есть только один столбец для рисования, он не проверяет ограничение, а для перетаскивания его проверка,

Спасибо, Джошуа

person Amitg2k12    schedule 04.02.2011