折叠 NSOutlineView Group 后如何保持选中行状态
How to keep the selected row state after collapsing the NSOutlineView Group
我想实现一个类似于 Finder.app 的边栏。但是我不知道如何让它在折叠和展开组后保持行选择状态。
如有任何想法或建议,我们将不胜感激。
您必须自己实施。系统不为你保留选择的原因是当一个项目被折叠时,它的所有子项目实际上都被释放了,所以它们根本不存在。
解决方案非常简单直接。
- 设置大纲视图以允许空选择(在 IB 中或通过代码)。这将防止系统在先前选择的项目折叠后自动选择另一个项目。
- 将所选项目保存在
ivar
中,并更新它以响应用户交互。为此,您可能需要实施 -outlineViewSelectionDidChange:
委托方法。请注意,您应该始终确保 [[notification object] selectedRow] != -1
在更新之前得到满足,因为折叠所选项目将导致此消息以 -1
的 selectedRow
发送。
- 在
-outlineViewItemDidExpand
委托方法中,如果 outlineView.selectedRow
是 -1
,请咨询您的 ivar
并通过发送 -selectRowIndexes:byExtendingSelection:
消息手动恢复选择你的 NSOutlineView
.
我想实现一个类似于 Finder.app 的边栏。但是我不知道如何让它在折叠和展开组后保持行选择状态。
如有任何想法或建议,我们将不胜感激。
您必须自己实施。系统不为你保留选择的原因是当一个项目被折叠时,它的所有子项目实际上都被释放了,所以它们根本不存在。
解决方案非常简单直接。
- 设置大纲视图以允许空选择(在 IB 中或通过代码)。这将防止系统在先前选择的项目折叠后自动选择另一个项目。
- 将所选项目保存在
ivar
中,并更新它以响应用户交互。为此,您可能需要实施-outlineViewSelectionDidChange:
委托方法。请注意,您应该始终确保[[notification object] selectedRow] != -1
在更新之前得到满足,因为折叠所选项目将导致此消息以-1
的selectedRow
发送。 - 在
-outlineViewItemDidExpand
委托方法中,如果outlineView.selectedRow
是-1
,请咨询您的ivar
并通过发送-selectRowIndexes:byExtendingSelection:
消息手动恢复选择你的NSOutlineView
.