如何在仍使用NSArrayController的同时直接响应NSTableView编辑?

时间:2012-04-30 15:37:53

标签: cocoa nstableview cocoa-bindings

在我的Cocoa应用程序中,我有一个单列NSTableView的工作表,其中列出了目录中的一堆文件(该应用程序备份了它的主数据库,将此列表提供给用户,以便他们使用可以恢复到特定的备份)。内容被NSArrayController加载到表视图中并提供给表视图,每个对象只是NSFileWrapper(我正在考虑使用NSURL,但我离题了)。 NSArrayController处理排序,在通过绑定选择行时启用按钮,这一切都很棒。我有一个NSWindowController子类对象(BackupsSheetController),它挂起了所有这些并存在于工作表的笔尖中。

但是,当用户编辑其中一个单元格时,我想通过适当地重新命名该单元格所代表的文件并将其置于新位置来响应BackupsSheetController中的更改。由于表视图绑定到NSArrayController,因此我不会收到NSTableViewDataSource消息– tableView:setObjectValue:forTableColumn:row:。如果我将我的BackupsSheetController设置为nib中NSTableView对象的数据源,我会发送该消息有时,但不经常发送,每次都不说。

我在这个场景中看到的大多数问题和示例通过在表视图中使用项目的自定义模型类来处理这一切,并使一些控制器对象成为观察者,以更改他们希望响应的属性。换句话说,每个项目都类似于BackupNode对象,而BackupsSheetController会观察每个项目对name属性的更改(或者我称之为的任何属性)。对于我的场景来说,这似乎完全有点过头了,但我也不想放弃我已经使用的绑定,而且我没有看到另一种方法来做到这一点。还有另一种方法可以做到这一点,以确保我可靠地获得setObject:...消息吗?或者我应该删除NSArrayController并使BackupsSheetController成为表的委托和数据源?

1 个答案:

答案 0 :(得分:2)

在“BackupNode”方案中,我不明白为什么BackupsSheetController会观察每个名称的更改。这是一种非常迂回的做事方式。我认为假设的BackupNode对象只会在其name属性的setter中进行必要的工作。

无论如何,我建议使用正确的模型对象。当您尝试构建仅包含Cocoa提供的对象(例如NSFileWrapperNSURLNSMutableDictionary)的模型时,从长远来看,您最终会做的工作比只做一个合适的工作要多模型对象。

在一个切线主题上,为什么你的窗口控制器在NIB中?它应该是加载(并拥有)NIB的东西,当然要求它在加载NIB之前存在,这意味着它不能在NIB中实例化。