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



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

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

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

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

无论如何,我建议使用适当的模型对象。当你尝试只用Cocoa提供的对象(如NSFileWrapperNSURLNSMutableDictionary(构建一个模型时,从长远来看,你最终会做更多的工作,而不是仅仅做一个合适的模型对象。

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

最新更新