NSTableView隐藏行功能是否可用?遇两处未文档化问题
关于NSTableView隐藏/显示行功能的两个未文档化问题
我需要在NSTableView中根据其他区域的选择,仅显示对象数组里的特定行。最初的实现方式是过滤数组,生成仅包含需显示内容的新副本作为数据源。后来考虑直接使用完整对象数组作为数据源,通过NSTableView.hideRows(at:withAnimation:)和.unhideRows(at:withAnimation:)方法控制行的显隐,但遇到了两处官方文档未提及的问题:
1. 无隐藏行时调用unhideRows(at:)会反向隐藏行
当hiddenRowIndexes为空时,调用unhideRows(at:)会将传入的IndexSet对应的行隐藏,这完全不符合直觉,且Apple官方文档未记录该行为。只要已有隐藏行存在,该方法就能正常工作——即从hiddenRowIndexes中移除传入的索引集合。
代码示例:
print(myTableView.hiddenRowIndexes) // 输出: 0 indexes let rows = IndexSet(arrayLiteral: 0,1,2,4,6) myTableView.hideRows(at: rows) print(myTableView.hiddenRowIndexes) // 输出: 5 indexes [0, 1, 2, 4, 6] let moreRows = IndexSet(arrayLiteral: 3,7,9,10,11) myTableView.hideRows(at: moreRows) print(myTableView.hiddenRowIndexes) // 输出: 5 indexes [0, 1, 2, 4, 6]
目前可以通过先检查NSTableView.hiddenRowIndexes.count是否为0来规避,但不确定这是已知Bug还是有意设计。
2. 隐藏行可被用户选中,与文档描述不符
Apple文档明确说明:“隐藏的表格行高度为0,用户无法选中,但已选中的行隐藏后仍保持选中状态”,但实际测试发现隐藏行可被选中:
- 单独按方向键时,仅在可见行之间切换选择;
- 按住SHIFT扩展选择时,会遍历所有行(包括隐藏行);
- 按CMD+A会选中所有行(包括隐藏行);
- 即使不主动调用
selectRowIndexes(_:byExtendingSelection:),系统也允许选中隐藏行。
这种问题只能通过监听selectedRowIndexes,检查是否包含隐藏行索引,若有则替换为下一个可见行并取消隐藏行的选中状态来规避,但这种实现反而不如直接使用过滤后的数组作为数据源简单。
当前使用环境:Xcode 11.7、macOS 10.14.6。已知AppKit 10.13修复过部分相关Bug,但该功能仍存在不完善、不可靠的问题。
内容的提问来源于stack exchange,提问作者Rebecka
相关产品推荐
相关产品推荐

