【问题标题】:How to get selected row in NSTableView? view(atColumn:row:makeIfNecessary:) return nil如何在 NSTableView 中获取选定的行?视图(atColumn:row:makeIfNecessary:) 返回 nil
【发布时间】:2025-12-19 13:35:06
【问题描述】:

我有一个NSTableview,其内容绑定到NSArrayController。 并且它的selectionIndexes 绑定到arrayController 的selectionIndexes。 并且这个 arrayController 绑定到了一个NSManagedObjectContext

因为arrayController的selectsInsertedObjects为真,所以当我向NSManagedObjectContext添加对象时,tableViewSelectionDidChange(_ notification: Notification)会被调用。我在这里设置断点并在控制台中调试(我将tableview的委托设置为自身):

(lldb) po selectedRow
11
(lldb) po selectedCell()
nil
(lldb) po numberOfColumns
2
(lldb) po numberOfRows
12
(lldb) po view(atColumn: 0, row: 0, makeIfNecessary: false)
nil
(lldb) po view(atColumn: 0, row: selectedRow, makeIfNecessary: false)
nil

我可以在表格视图中看到薮行。

但是为什么po view(atColumn: 0, row: 0, makeIfNecessary: false) 返回零?

如何在委托方法tableViewSelectionDidChange(_ notification: Notification) 中获取选中的行?

【问题讨论】:

  • 选中的行是11。单元格视图被重用。表格视图可以创建一个视图来绘制所有行。你想完成什么?
  • @Willeke 我想获取选定的行并更改其属性。不要创建一个新的。
  • 更改tableView(_:viewFor:row:)中的属性。
  • @Willeke 我想在选择特定行时进行更改。
  • 你想改变什么?视图的属性还是数据的属性?

标签: swift macos nstableview


【解决方案1】:

我怀疑表格视图在更新其布局之前发布了NSTableViewSelectionDidChangeNotification。因此,您在创建子视图之前向表视图询问子视图。

这就是makeIfNecessary 参数的用途。试试这个方法:

po view(atColumn: 0, row: selectedRow, makeIfNecessary: true)

【讨论】:

  • 我不想手动创建一行。我想获取自动创建的选定行。你能解释一下为什么po view(atColumn: 0, row: 0, makeIfNecessary: false) 返回 nil 吗? tableview 中恰好有一行,并且该行是可见的。
  • 根据上面cmets中debug命令的结果,正好有12行(不是1行)。