NSTableView hideRows在以前的旧行留有空白

时间:2019-04-19 18:06:26

标签: macos cocoa nstableview appkit

我正在努力在用户点击按钮时隐藏和显示行。当我调用NSTableView.hideRows时,行确实按照预期进行动画处理,但是tableView不会将其余行拉到一起,因此tableView的中间显示出很大的间隙。如果我点击另一行,则会得到其余行的动画。

下面显示的图像...

具有所有行的表:

Table with all rows

显示的间隙:

enter image description here

代码:

  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的间隙。

我很想看看是否有可能隐藏当前不在屏幕上的行。

1 个答案:

答案 0 :(得分:1)

好,我解决了。

我认为NSTableView中的hideRows(at)函数存在错误,但是您可以通过执行以下操作来解决此问题。

  1. 调用tableView.hideRows(at)
  2. 调用tableView.noteHeightOfRows(withIndexesChanged:range)
  3. 将这段代码添加到您的tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?

    if tableView.hiddenRowIndexes.contains(row) {
      return nil
    }
    

这将确保tableView在进行动画处理时不会尝试绘制该行。