我正在研究当用户点击按钮时隐藏和显示行的功能。当我调用NSTableView.hideRows
时,行会像预期的那样激活,但是tableView
不会将剩余的行与它一起拉动,因此在tableView
的中间显示了一个很大的间隙。如果我点击另一行,那么我会得到剩余行的动画。
图片如下所示......
包含所有行的表:
差距显示:
码:
func numberOfRows(in tableView: NSTableView) -> Int {
return 50
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier.testCell, owner: nil) as? TestCell {
cell.label.stringValue = String(row)
return cell
}
return nil
}
func tableViewSelectionDidChange(_ notification: Notification) {
if let tableViewObject = notification.object as? NSTableView {
let index = tableViewObject.selectedRow
if index >= 0 {
self.tableView.hideRows(at: IndexSet(arrayLiteral: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), withAnimation: .slideUp)
}
}
}
我错过了什么吗?
Git链接https://gitlab.com/RollingGoron/broken-nstable
****************更新*******************
在self.tableView.noteHeightOfRows(withIndexesChanged: range)
之后调用hideRows
修复了我的示例项目中的问题,但是如果您尝试隐藏屏幕外的行,则无法解决问题。
例如如果您尝试隐藏100行,它会将它们设置为动画,但不会留下100行间隙,根据行的大小,将留下~50的间隙。
我很想知道是否可以隐藏当前屏幕外的行。
好的,我解决了。
我认为NSTableView中的hideRows(at)func存在一个错误,但你可以通过执行以下操作来解决这个问题。
tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
if tableView.hiddenRowIndexes.contains(row) {
return nil
}
这将确保tableView在动画播放时不会尝试绘制行。