我有一个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
也未被调用。
这个问题已经持续了好几个小时。是什么原因引起了这个?
答案 0 :(得分:12)
我明白了。仅当- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item
为该项目返回YES时,该项目才可折叠。否则,您只能展开该项目。
答案 1 :(得分:2)
在我的情况下,我的项目是 struct ,所以这些功能不起作用。然后我需要更改为类,并且它有效。因为当我使用这段代码"让item = outlineView.item(atRow:selectedIndex)"在 struct 中,它将复制值并创建新对象。因此,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)
}
}
答案 2 :(得分:0)
这对我来说真的很好
id item = [sender itemAtRow:[sender clickedRow]];
if ([self outlineView:sender isItemExpandable:item]) {
if ([sender isItemExpanded:item])
[sender collapseItem:item];
else
[sender expandItem:item];
}
答案 3 :(得分: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