我创建了新的基于文档的应用程序。
我在NSDocument的子类中实现了dataOfType
- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
return [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects];
}
in xib http://i.minus.com/iH2Rj9v5oOhTn.png
当我从菜单中单击“保存”时,没有任何事情会发生,控制台中的任何错误。 我在dataOfType中设置了一个断点,当我点击“保存”时,应用程序没有停止。
有什么建议吗?
修改
我认为它可能与我使用自定义NSWindowController和自定义xib的事实有关。 我在加载自定义xib时进行了测试,一切都很好,dataOfType方法被调用等。
我应该以某种方式连接我的自定义xib(窗口)和NSDocument的子类吗?
答案 0 :(得分:0)
看起来你的“保存”菜单项已正确连接,所以让我们专注于代码(首先发布它的+1)。
您在代码中不执行任何操作以确保-archivedDataWithRootObject:
返回有效数据,或者如果不这样做则设置错误。我最好的猜测(因为你没有提供足够的细节来做任何事情而不是猜测),因为你对-archivedDataWithRootObject:
的调用是这样做的,所以你返回零。检查是否获得有效数据,如果没有则设置outError。
你为什么会得到零?也许通过归档阵列控制器的-arrangedObjects
数组创建的对象图中的一个或多个对象不符合<NSCoding>
。如果您的数组控制器包含您创建的自定义类的对象而不是标准的Property List容器,则可能就是这种情况。
阅读档案和序列化编程指南(特别是Encoding and Decoding Objects部分),了解如何使自定义类<NSCoding>
兼容,以便它知道如何序列化自身(将自身写入一个字节)适用于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
}