NSOutlineView无法折叠项目。

5

我有一个NSOutlineView,点击行将展开/折叠该项(如果该项可展开)。

    if ([self.outlineView isItemExpanded:item]) {
        NSLog("Will collapse item : %@", item);
        [[self.outlineView animator] collapseItem:item];
    }
    else {
        [[self.outlineView animator] expandItem:item];
    }

展开子项的功能正常,但是折叠子项并没有起作用。在执行 collapseItem: 方法之前,我已经获取了日志,并且子项是正确的。代理方法 - (BOOL)outlineView:(NSOutlineView *)outlineView shouldCollapseItem:(id)item 也没有被调用。

我已经花费数小时时间解决这个问题,有什么想法是什么原因导致这种情况发生?

4个回答

12

我搞清楚了。看起来只有在- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item返回YES时,该项才会可折叠。否则,您只能展开该项。


谢谢您的发帖。我有同样的问题。似乎很奇怪它只能扩展。将不得不采取不同的方法... - Giles

2

在我的情况下,我的项目是结构体,所以这些函数不起作用。然后我需要改成,就可以了。因为当我在结构体中使用这段代码“let item = outlineView.item(atRow: selectedIndex)”时,它会复制值并创建新对象。所以outlineView无法识别item => 它不起作用。

    let selectedIndex = outlineView.selectedRow
    if let item = outlineView.item(atRow: selectedIndex) {
        if outlineView.isItemExpanded(item) {
            outlineView.collapseItem(item, collapseChildren: true)
        }else {
            outlineView.expandItem(item, expandChildren: true)
        }
    }

0
NSOutlineView的项目是否折叠取决于以下方法,如果要折叠则返回true,否则返回false。
func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool

我尝试制作一个类似于MAC系统首选项 -> 键盘 -> 快捷键的演示。

enter image description here

func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool {

    let isExpanded = outlineView.isItemExpanded(item)

    if isExpanded {

        return true

    } else {

        return false
    }
}

func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {

    let view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "OutlineTableCell"), owner: self) as! OutlineTableCell

    view.setOutlineTableCellLaytout(forNode: (item as? SectionTreeNode)!)

    view.disclosure.action = nil

    view.disclosure.action = #selector(didDisclosureClicked(_:))

    view.selectedItem = item as? SectionTreeNode

    return view

}

@objc func didDisclosureClicked(_ sender: NSButton) {

    let view = sender.superview?.superview as? OutlineTableCell

    let isExpand = outlineView.isItemExpanded(view?.selectedItem)

    isExpand ? outlineView.collapseItem(view?.selectedItem, collapseChildren: true) : outlineView.expandItem(view?.selectedItem, expandChildren: true)

}

我的输出如下图所示:

enter image description here


0

这对我来说非常好用

id item = [sender itemAtRow:[sender clickedRow]];
if ([self outlineView:sender isItemExpandable:item]) {
    if ([sender isItemExpanded:item])
        [sender collapseItem:item];
    else
        [sender expandItem:item];
}

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