NSOutlineView 不折叠项目
Posted
技术标签:
【中文标题】NSOutlineView 不折叠项目【英文标题】:NSOutlineView doesn't Collapse Item 【发布时间】:2013-06-15 10:19:07 【问题描述】:我有一个 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
也没有被调用。
解决这个问题已经好几个小时了。任何想法是什么原因造成的?
【问题讨论】:
【参考方案1】:我想通了。似乎只有当 - (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item
为该项目返回 YES 时,该项目才可折叠。否则,您只能展开该项目。
【讨论】:
感谢您的发帖。我有同样的问题。似乎很奇怪,它只能扩展。将不得不采取不同的方法......【参考方案2】:就我而言,我的项目是 struct 所以这些功能不起作用。然后我需要更改为class,它起作用了。因为当我在 struct 中使用此代码“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)
【讨论】:
【参考方案3】:这对我来说真的很好
id item = [sender itemAtRow:[sender clickedRow]];
if ([self outlineView:sender isItemExpandable:item])
if ([sender isItemExpanded:item])
[sender collapseItem:item];
else
[sender expandItem:item];
【讨论】:
【参考方案4】: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)
我的输出如下图:
【讨论】:
以上是关于NSOutlineView 不折叠项目的主要内容,如果未能解决你的问题,请参考以下文章