cocoa - NSDocument 子类实例显然不在响应者链中

标签 cocoa nsdocument

我正在创建我的第一个基于 NSDocument 的应用程序。我可以从头开始创建新文档,也可以通过导入旧文件来创建新文档。

这个应用程序将允许每个文档有多个窗口,因此我将覆盖 makeWindowControllers。目前这个方法很简单:

- (void) makeWindowControllers
{
    if (documentDatabase == nil) return;
    DataSheetWindowController * dswc = [[DataSheetWindowController alloc] initWithDatabase:documentDatabase];
    [self addWindowController: dswc];
}

该窗口按预期显示,但是“保存”、“恢复为保存”和其他启用文档的菜单被禁用,就好像该文档不在响应程序链中一样。

作为实验,我尝试将此方法添加到我的 NSWindowController 类中:

- (void)saveDocument:(id)sender {
    [[self document] saveDocument:sender];
}

使用此方法后,将启用“保存”菜单项,选择它会调用文档的保存方法。

通过阅读 Stack Overflow 上的文档和其他问题,很明显出现了问题——我不应该将此方法放在 NSWindowController 类中。我确信我忽略了一些愚蠢的事情,但我一生都无法弄清楚它是什么,或者这里或网络上其他地方对此问题的任何其他提及。

一些可能有用的附加信息——在 IB 中,窗口的所有者和委托(delegate)被设置为 NSWindowController。我创建了一个显示响应者链的方法(请参阅 How to inspect the responder chain? ),但该文档未列出。这是响应者链的输出(但是,由于 NSDocument 不是 NSResponder 的子类,我不确定它是否应该列出)。

RESPONDER CHAIN:
<NSClipView: 0x102344350>
<NSScrollView: 0x102344480>
<NSView: 0x102345040>
<NSWindow: 0x10234e090>

由于我放入 NSWindowController 类中的 saveDocument 方法确实有效,这表明窗口 Controller 确实知道它与文档关联。

那么——对于为什么文档的行为就像不在响应者链中一样有什么想法吗?

更新信息:设置新文档后,initWithType 方法包含此临时行以确保文档状态已编辑:

[self updateChangeCount:NSChangeDone];

我已验证 isDocumentEdited 返回 true。

最佳答案

我建议解决方案就是此处指出的解决方案:

https://stackoverflow.com/a/9349636/341994

在包含窗口 Controller 将加载的窗口的 Nib 中,文件所有者代理需要属于窗口 Controller 的类(选择文件所有者代理并检查身份检查器以确认/配置它)及其窗口导出必须 Hook 到窗口,并且窗口的委托(delegate)导出必须 Hook 到文件所有者代理(选择文件所有者代理并检查连接检查器以确认这一点)。

关于cocoa - NSDocument 子类实例显然不在响应者链中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305743/

相关文章:

cocoa - 在 QTMovie 上调用播放会导致 Snow Leopard 上的屏幕保护程序停用

cocoa - 设置多个 NSWindowController 对象和 NSDocument

objective-c - 如何在基于文档的应用程序中单击关闭时设置保存通知

objective-c - NSDocument 应用程序和文件扩展名

objective-c - NSDocumentController currentDocument 返回 nil

cocoa - 使用 SecKeychainFindGenericPassword 访问 KeyChain 时偶尔出现 errSecAuthFailed (-25293)?

objective-c - 推荐用于覆盖 NSObject 的哈希方法的哈希函数

objective-c - 检查多个WebView是否已完成加载

macos - 有没有办法在 Swift 中以编程方式设置 NSCollectionView?

cocoa - 启动时延迟 Cocoa NSDocument 创建