Cocoa 无法保存在基于文档的应用程序中

Cocoa 无法保存在基于文档的应用程序中,cocoa,Cocoa,我创建了新的基于文档的应用程序 我在NSDocument的子类中实现了dataOfType - (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { return [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects]; } 当我从菜单中

我创建了新的基于文档的应用程序

我在NSDocument的子类中实现了dataOfType

- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
 {
         return [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects];
 }

当我从菜单中单击“保存”时,控制台中不会发生任何错误。 我在dataOfType中设置了一个断点,当我单击“保存”时,应用程序并没有停止

有什么建议吗

编辑

我想这可能与我使用自定义NSWindowController和自定义xib有关。 我在加载自定义xib时做了一个测试,一切都很好,调用了dataOfType方法等等


我是否应该以某种方式将我的自定义xib(窗口)与NSDocument的子类连接起来?

看起来您的“保存”菜单项连接正确,所以让我们集中讨论代码(+1,因为它首先发布了)

在代码中不执行任何操作以确保
-archivedDataWithRootObject:
返回有效数据,否则将设置错误。我最好的猜测是(因为你没有提供足够的细节来做任何事情,除了猜测),你返回nil是因为你对
-archivedDataWithRootObject:
的调用也在做同样的事情。检查是否获得有效数据,如果没有,则设置外部错误

你为什么会得到零分?通过归档阵列控制器的
-arrangedObjects
阵列创建的对象图中的一个或多个对象可能不符合
要求。如果数组控制器包含您创建的自定义类的对象,而不是标准属性列表容器,则可能会出现这种情况

阅读《归档和序列化编程指南》(特别是本节),了解如何使自定义类符合
,以便它知道如何序列化自身(将自身写入适合NSKeyedArchiver的字节流,等等,并从此类字节流创建自身的实例)

此外,您还需要学习如何使用调试器。你在一个黑暗的山洞里摸索,有很多陷阱,没有它就没有手电筒。尝试在您希望调用的方法中设置断点。如果它们没有被调用,你可以检查出口/动作等。如果它们被调用,你可以逐行检查每一行,确保一切都按照你的预期执行。如果编写更详细的代码,则在调试器中暂停时可以更轻松地检查结果。在您的案例中,两行代码可以帮助您完成多个任务:

- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
    NSData * myData = [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects];
    // You should be handling nil (setting a descriptive error) here if (!myData)...
    return data; // breakpoint here; you should now see myData is likely nil
}

“当我从菜单中点击“保存”时,不会发生任何事情,控制台中会出现任何错误。”请更好地解释这一点。同时请注意选择更精确的主题名称。“第一个基于文档的应用程序”完全没有告诉我们您的问题的性质。我在我的问题-问题中写道,dataOfType方法没有被调用,而不是“为什么存档不起作用?”您最初写道,当您单击“保存”时,不会发生任何事情(但没有更多的信息)。然后你在我写了我的答案后编辑了它,把剩下的都包括进去。我回答了你最初提出的问题。