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

4 回答 4

12

我想到了。- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item似乎该项目仅在为该项目返回 YES时才可折叠。否则,您只能展开该项目。

于 2013-06-19T03:09:04.913 回答
2

就我而言,我的项目是结构,所以这些功能不起作用。然后我需要更改为class,并且它起作用了。因为当我在结构中使用此代码“let item = outlineView.item(atRow: selectedIndex)”时,它将复制值并创建新对象。所以outlineView无法识别该项目=>它不起作用

    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)
        }
    }
于 2017-12-06T07:50:18.353 回答
0

这对我来说真的很好

id item = [sender itemAtRow:[sender clickedRow]];
if ([self outlineView:sender isItemExpandable:item]) {
    if ([sender isItemExpanded:item])
        [sender collapseItem:item];
    else
        [sender expandItem:item];
}
于 2015-02-25T21:14:30.860 回答
0

NSOutlineView 的项目是否折叠取决于下面的方法,如果要折叠则返回 true,否则返回 false。

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

我尝试制作类似 MAC 系统偏好设置 -> 键盘 -> 快捷方式的演示

在此处输入图像描述

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)

}

我的输出如下图:

在此处输入图像描述

于 2018-04-28T04:16:29.630 回答