Cocoa 在仍然使用NSArrayController的情况下,如何直接响应NSTableView编辑?

Cocoa 在仍然使用NSArrayController的情况下,如何直接响应NSTableView编辑?,cocoa,nstableview,cocoa-bindings,Cocoa,Nstableview,Cocoa Bindings,在我的Cocoa应用程序中,我有一个单列NSTableView的工作表,其中列出了目录中的一组文件(该应用程序备份其主数据库,向用户提供此列表,以便他们可以还原到特定备份)。内容由NSArrayController加载到表视图并提供给表视图,每个对象只是一个NSFileWrapper(我正在考虑改用NSURL,但我离题了)。NSArrayController处理排序,通过绑定选择行时启用按钮,这一切都很好。我有一个NSWindowController子类对象(backupsheetcontrol

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

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

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

在“BackupNode”场景中,我不明白为什么
BackupSheetController
会观察每个表的名称变化。这是一种非常迂回的做事方式。我认为假设的
BackupNode
对象只需在其setter中为
name
属性做必要的工作

无论如何,我建议使用适当的模型对象。当您尝试仅使用Cocoa提供的对象(如
NSFileWrapper
NSURL
、或
NSMutableDictionary
)构建模型时,从长远来看,您所做的工作要比只创建一个适当的模型对象要多


关于一个切题,为什么您的窗口控制器在NIB中?它应该是加载(并拥有)NIB的对象,这当然要求它在加载NIB之前就存在,这意味着它不能在NIB中实例化。

在切线上:NIB的所有者是我的NSDocument子类,它从NIB加载它并将其显示为一张表。“controller”对象的存在是为了处理工作表的操作,绑定到它的对象,并将这些内容从我的文档子类中移除,而我的文档子类可能会变得非常大。当然可以接受其他想法!>“无论如何,我建议使用合适的模型对象。”你和我,我只是没有把备份看作模型,我想我是迟钝了;-)