我现在有NSOutlineView,它仅列出根项的子项。一切正常,除了当我尝试使用拖放重新排列项目时。前面带有圆圈的线始终位于第一行的上方,并且在需要在其他项目之间拖动时不会跟随我的项目。但是,我仍然可以正确地获得索引位置,因此仍可以在数据源中正确地重新排列它们。我不想通过将它们拖到彼此上来重新排列项目,我只想从根级别开始重新排列项目(例如Mac上的VLC播放列表)。

这是我的四个必需方法:

//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;
}

最佳答案

我对您想要的期望行为感到困惑。此示例项目是否实现了所需的拖放突出显示行为(它在每行之间显示了o––––––指示器,这对于我来说VLC似乎是这样工作的):

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

(请注意,它还不包含实际进行项目重新排序的代码)。

如果不是,您能否再次描述它目前正在做什么以及您希望它做什么?

另外,您没有在此处包含代码,但是您确定要为LOCAL_REORDER_PASTEBOARD_TYPE拖动类型注册大纲视图吗?我会在awakeFromNib中做到这一点:

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


这对于轮廓视图使其自身成为拖动目标是必要的。

关于objective-c - 使用拖放重新排列时,NSOutlineView顶部的小圆圈线棒,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15593387/

10-12 14:50