单击行中的任意位置展开NSOutlineView项

时间:2014-05-14 21:09:59

标签: objective-c macos cocoa nsoutlineview

在整个行中单击一下,扩展NSOutlineView行的最便捷方法是什么? (不是披露三角形)

这有一个设置吗?或者一些神奇的模式设置改变了类似于源列表样式的行为?

2 个答案:

答案 0 :(得分:7)

最简单的方法两者扩展一起崩溃似乎是单击的目标/操作。我曾尝试覆盖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];
}

optionPressed BOOL以及随后在expandChildrencollapseChildren中的使用是由@ ben-haller建议的,他指出"选项点击展开三角形扩展或者折叠所有包含的物品。" (引自About Outline Views)Ben的修改将该选项点击行为扩展到"行中的任何地方"方法在这里。

答案 1 :(得分:0)

快速版本:

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)
        }
    }
}