gpt4 book ai didi

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

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

我正在创建我的第一个基于 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/

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