什么是快速展开NSOutlineView行的最有效方法?(而不是展开三角形)
是否有单个设置可以完成此操作?还是有类似源列表样式的行为更改的神奇模式设置?
是否有单个设置可以完成此操作?还是有类似源列表样式的行为更改的神奇模式设置?
实现同时展开和折叠的最简单方法似乎是使用单击的目标/动作。我尝试在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 的定义,并在 expandChildren
和 collapseChildren
中使用它,他指出,“在折叠三角形上选项点击会展开或折叠所有包含的项目。”(引自关于大纲视图)Ben的修改将该选项单击行为扩展到此处的“行中任何位置”方法。 < / p >
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)
}
}
}
[self.myOutlineView setTarget:self]
。如果在IB中没有配置目标操作,则我认为这是正确的。由于我不需要它,所以我一定在IB中对大纲视图自己进行了一些非编程目标操作。为了完整起见,我添加了此行。谢谢,Ben。 - stevesliva