You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:33:14