在整个行中单击一下,扩展NSOutlineView行的最便捷方法是什么? (不是披露三角形)
这有一个设置吗?或者一些神奇的模式设置改变了类似于源列表样式的行为?
答案 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以及随后在expandChildren
和collapseChildren
中的使用是由@ 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)
}
}
}