单击行的任何位置展开NSOutlineView项目

3
什么是快速展开NSOutlineView行的最有效方法?(而不是展开三角形)
是否有单个设置可以完成此操作?还是有类似源列表样式的行为更改的神奇模式设置?
2个回答

8

实现同时展开和折叠的最简单方法似乎是使用单击的目标/动作。我尝试在outlineview代理中覆盖选择功能,这对于展开有效,但对于折叠无效。以下是单击展开/折叠的代码:

[self.myOutlineView setTarget:self]; // Needed if not done in IB
[self.myOutlineView setAction:@selector(outlineViewClicked:)];
[self.myOutlineView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];

- (void) outlineViewClicked:(NSOutlineView*)sender
{
    id clickItem = [sender itemAtRow:[self.itemsOutlineView clickedRow]];
    if (clickItem)
    {
        BOOL optionPressed = (([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) == NSAlternateKeyMask);

        [sender isItemExpanded:clickItem] ? 
            [sender.animator collapseItem:clickItem collapseChildren:optionPressed] :
            [sender.animator expandItem:clickItem expandChildren:optionPressed];
    }
}

将其扩展为折叠同级元素:

- (void) outlineViewClicked:(NSOutlineView*)sender
{
    id clickItem = [sender itemAtRow:[self.itemsOutlineView clickedRow]];

    if (!clickItem)
        return;

    BOOL optionPressed = (([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) == NSAlternateKeyMask);

    // Collapse the sibling nodes (tree controller type NSTreeNode)
    for (NSTreeNode* node in ((NSTreeNode*)clickItem).parentNode.childNodes)
    {
        if (node != clickItem && [sender isItemExpanded:node]) 
            [sender.animator collapseItem:node];
    }

    [sender isItemExpanded:clickItem] ? 
        [sender.animator collapseItem:clickItem collapseChildren:optionPressed] : [sender.animator expandItem:clickItem expandChildren:optionPressed];
}
< p > @ben-haller 建议添加了 optionPressed BOOL 的定义,并在 expandChildrencollapseChildren 中使用它,他指出,“在折叠三角形上选项点击会展开或折叠所有包含的项目。”(引自关于大纲视图)Ben的修改将该选项单击行为扩展到此处的“行中任何位置”方法。 < / p >

@ben-haller建议还需要[self.myOutlineView setTarget:self]。如果在IB中没有配置目标操作,则我认为这是正确的。由于我不需要它,所以我一定在IB中对大纲视图自己进行了一些非编程目标操作。为了完整起见,我添加了此行。谢谢,Ben。 - stevesliva

1

Swift版本:

outlineView.target = self
outlineView.action = #selector(outlineViewClicked(_:))

@objc private func outlineViewClicked(_ sender: NSOutlineView) {
    expandOrCollapseRow(outlineView: sender)
}

private func expandOrCollapseRow(outlineView: NSOutlineView) {
    if let clickedItem = outlineView.item(atRow: outlineView.clickedRow) {
        if  outlineView.isItemExpanded(clickedItem) {
            outlineView.animator().collapseItem(clickedItem)
        } else {
            outlineView.animator().expandItem(clickedItem, expandChildren: true)
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接