如何在NSTableView中隐藏行并兼容OS X 10.11之前系统?
解决NSTableView静态单元格隐藏行(兼容OS X 10.11以下)
嘿,我之前处理过静态NSTableView隐藏行的需求,刚好碰到和你一样的问题——hideRows(at:withAnimation:)只支持10.11+,设行高0又触发系统断言报错。给你几个实用的解决方案:
方案一:用极小行高模拟隐藏(最稳妥)
系统只是要求行高必须大于0,所以我们可以用一个接近0的数值(比如0.01)来代替0,视觉上完全看不见,同时避开断言错误。
步骤:
- 实现代理方法返回行高:
func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat { // 假设isRowHidden是你判断该行是否需要隐藏的自定义逻辑 if isRowHidden(row) { return 0.01 // 用极小值代替0,绕过系统断言 } return tableView.rowHeight // 返回默认行高 }
- 防止用户选中隐藏的行(可选但建议):
func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { if isRowHidden(row) { return false } return true }
方案二:结合单元格隐藏+极小行高
如果静态单元格里有复杂的控件,单纯改高可能还有残留布局问题,可以同时把单元格本身设为隐藏:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "YourCellID"), owner: self) as! YourCustomCell if isRowHidden(row) { cell.isHidden = true } else { cell.isHidden = false } return cell }
再配合方案一的行高设置,双重保障隐藏效果。
为什么直接设行高0不行?
你碰到的断言错误是因为NSTableView的内部逻辑强制要求行高必须大于0,这是AppKit的硬限制,所以不能用0.0作为行高返回值,必须用大于0的极小值绕过这个检查。
内容的提问来源于stack exchange,提问作者Newsonic
相关产品推荐
相关产品推荐

