始终在NSOutlineView中显示披露三角形,即使对于空条目

3
我有一个显示“章节和页面”的应用程序,它在一个`NSOutlineView`中展示。为了让用户明确,“章节”可以包含“页面”,我希望大纲视图始终显示章节的展开三角形,即使它们里面没有页面(即为空)。以下是一个例子:enter image description here请注意,第一章是空的(没有页面)并且没有展开三角形。我希望该三角形显示出来,这样当用户点击它时,他们就会意识到这是一个可以包含其他项的“容器”项。我尝试实现各种委托方法,但无法使空条目显示展开三角形。示例项目:https://www.dropbox.com/s/fdggjod78t0isjr/OutlineViewTest.zip?dl=0

你是如何实现 - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item NSOutlineView 代理方法的? - Daniyar
我实现了 isItemExpandable: 方法,始终返回 YES。但是,对于没有子项的项目,该方法不会被调用。 - Mark
你能提供你的代码吗?我对 NSOutlineViewDataSource 方法很感兴趣。 - Daniyar
@Astoria,我添加了一个示例项目的链接。 - Mark
2个回答

3
好的,现在我明白了。你正在使用Cocoa绑定,这意味着一些dataSource方法不应该被调用。请参考NSOutlineViewDataSource参考页面

'- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item'

重要

虽然此方法在协议中标记为@optional,但如果您不使用Cocoa绑定提供大纲视图的数据,则必须实现此方法。

只需尝试在没有Cocoa绑定的情况下实现它。或者您可以找到打破绑定过程并找出如何拒绝删除披露按钮的方法。
是的,还有第三种方法。您可以创建MyTableCellView.xib并添加自己的披露按钮。
UPD
要确定哪个项目应具有披露三角形,可以在Tree Controller属性检查器选项卡上使用Leaf关键路径。 enter image description here 别忘了将模型的值添加到您的数据中,就像这样。
@{@"title": @"Chapter 1 (empty)", @"isLeaf":@(NO)}

enter image description here


感谢您的建议。不使用绑定实现并不是一个真正的选择,因为这会使我的应用程序更加复杂(它已经是一个相当大的应用程序了)。添加自己的按钮可能有效,但也不太合适。我仍然希望通过扩展NSOutlineView或一些委托方法来解决问题... - Mark
@Mark 更新了答案。 - Daniyar

1
你需要实现 NSOutlineViewDelegateoutlineView:shouldShowOutlineCellForItem: 方法,并让它返回 YES。
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item {
    return YES;
}

“大纲单元格”是折叠三角形。在返回YES的同时,您需要这个“isExpandable”。 方法的参考中说:

返回NO会导致frameOfOutlineCellAtRow:返回NSZeroRect

此处关于如何更改三角形图像的第一个答案似乎表明,框架用于单元格和基于视图的大纲视图,因此该方法应适用于两者。 (请注意,更简单的解决方案是那里的第二个答案。)
此答案为wiki...我怀疑我漏掉了什么。

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