NSTableView hideRows оставляет пустое место, где когда-то были старые строки - PullRequest
0 голосов
/ 19 апреля 2019

Я работаю над возможностью скрывать и показывать строки, когда пользователь нажимает на кнопку.Когда я вызываю 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 Ответ

1 голос
/ 20 апреля 2019

Хорошо, я решил это.

Я думаю, что есть ошибка с функцией hideRows (at) в NSTableView, но вы можете обойти это, выполнив следующее.

  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 не будет пытаться нарисовать строку при ее анимации.

...