gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:05:16 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

扯个题外话,为什么你的窗口 Controller 在NIB中?它应该是加载(并拥有)NIB 的东西,这当然要求它在加载 NIB 之前就存在,这意味着它不能在 NIB 中实例化。

关于cocoa - 如何在仍然使用 NSArrayController 的同时直接响应 NSTableView 编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com