1

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

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

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

4

1 回答 1

2

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

无论如何,我建议使用适当的模型对象。NSFileWrapper当您尝试仅使用、NSURL或等 Cocoa 提供的对象来构建模型时NSMutableDictionary,从长远来看,您最终会比仅制作正确的模型对象做更多的工作。

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

于 2012-05-01T00:08:36.170 回答