2013-03-23 32 views
0

我有NSOutlineView,目前只列出根項目的子項。一切正常,除非我嘗試使用拖放方式重新排列項目。當它們需要在其他項目之間拖動時,它前面的圓形線始終位於最上面一排,並且不跟隨我的物品。但是,我仍然可以正確地獲得索引位置,因此我仍然可以在數據源中正確重新排列它們。我不想重新排列項目,只需將它們拖放到對方,我只想重新排列根級別的項目(如Mac上的VLC播放列表)。當使用拖放重新排列時,小圓圈線卡在NSOutlineView頂部

這裏是我的四個必需的方法:

//queue is a C-based data structure 

-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item 
{ 
    if(item == nil){ 
     return queue.count; //each list item 
    }else{ 
     return 0; //no children of each list item allowed 
    } 
} 

-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item 
{ 
    if(item != nil) return nil; 

    return [[NSDictionary dictionaryWithObjectsAndKeys: 
      [NSNumber numberWithLong:index],@"index", 
      [NSString stringWithFormat:@"%s",queue.item[index].filepath],@"filePath", 
      nil] copy]; 
} 

-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item 
{ 
    if(item == nil){ 
     return YES; 
    }else{ 
     return NO; 
    } 
} 

-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item 
{ 
    if(item == nil) return nil; 

    return [item objectForKey:[tableColumn identifier]]; 
} 

而且我拖方法:

-(BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard 
{ 
    [pasteboard declareTypes:[NSArray arrayWithObject:LOCAL_REORDER_PASTEBOARD_TYPE] owner:self]; 
    [pasteboard setData:[NSData data] forType:LOCAL_REORDER_PASTEBOARD_TYPE]; 
    return YES; 
} 

-(NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id <NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(NSInteger)index 
{ 
    NSUInteger op = NSDragOperationNone; 

    if(index != NSOutlineViewDropOnItemIndex){ 
     op = NSDragOperationMove; 
    } 
    return op; 
} 

回答

1

我有點困惑什麼期望你想要的行爲。這是否樣本項目達到預期的拖放突出特性(它顯示每行之間的o––––––指標,它是VLC如何出現在這裏工作對我來說):

http://www.markdouma.com/developer/NSOutlineViewFinagler.zip

(請注意,它不包括代碼還沒有實際進行項目的重新排序)。

如果不是,你可以再次描述它現在做什麼以及你想要做什麼?

此外,您並未在此處包含代碼,但您是否確保註冊LOCAL_REORDER_PASTEBOARD_TYPE拖動類型的大綱視圖?我會做在awakeFromNib

- (void)awakeFromNib { 
    [self.outlineView registerForDraggedTypes:@[LOCAL_REORDER_PASTEBOARD_TYPE]]; 
} 

這是必要的大綱視圖允許自己受到拖累目的地。