代码之家  ›  专栏  ›  技术社区  ›  Mark A. Donohoe

Cocoa应用程序框架和包

  •  3
  • Mark A. Donohoe  · 技术社区  · 15 年前

    每个包都有一个且只有一个窗口,因此我希望使用基于文档的。这些文件也可以被复制、重命名、移动等,就像其他文件一样,是这样一个体系结构的一部分。

    但我完全不知道如何在文档框架中实现这一点!我在文档中看到的每一处似乎都在讨论文件的内存表示,然后使用NSDocument重写中提供的路径写出这些文件(因为Cocoa可能会移动它等等),但是我使用的是一个位于磁盘上的SQLite数据库,而不是内存中。

    所以让我们假设这是正常的。如何实现save/save as,以控制写入磁盘的所有内容?我不想(我不能)乱搞数据结构之类的。我只想得到一个用户在“另存为”对话框中选择的psth(新的),并能够在那里写我需要的东西。简单。但是,50多页的文档开发者.apple.com关于基于文档的体系结构告诉我在哪里可以重载很多东西,但是每个东西似乎都源于文档的内存表示,这又不是我的包。从技术上讲,只有内部XML文件才是绑定到文档的内容。其他一切都只是支持它。

    作记号

    3 回复  |  直到 15 年前
        1
  •  2
  •   Peter Hosey    15 年前

    实施 the readFromURL:ofType:error: method 在你的文档类中。或者,由于您的文档类型是包类型,所以实现 the readFromFileWrapper:ofType:error: method

    您不必将数据读入内存;您可以在实现的任何方法中执行任何操作,包括打开数据库。

    如何实现save/save as,以控制写入磁盘的所有内容?

    实施 the writeToURL:ofType:error: method the fileWrapperOfType:error: method .

    如果您在内存中有或可以轻松地创建数据,则可以实现 readFromData:ofType:error: dataOfType:error: 方法。基于URL和基于文件包装器的方法适用于内存中的数据不是选项的情况。文件包装器的主要用途是用于像您这样的包类型。

        2
  •  1
  •   Mark A. Donohoe    15 年前

    萨维图尔:类型:保存操作:错误:

        3
  •  0
  •   Peter Hosey    15 年前

    这当然是我尝试的第一件事,但是如果你阅读开发人员文档——特别是基于Cocoa文档的架构——这里是关于这些方法的说明。。。

    如果重写无法从传入的参数确定所需的所有信息,请考虑重写另一个方法。例如,如果您看到需要从rea的重写中调用fileURL数据格式:ofType:error:,也许您应该替代readFromURL:类型:错误:。另一个例子是,如果您看到需要从w的重写中调用fileURL仪式:通常:error:,也许您应该重写w仪式:通常:保存操作:originalContentsURL:错误:。

    换句话说,似乎你不能假设传递给你的URL是磁盘上“something”最终被写入的实际位置,这会在处理由URL打开的数据库文件时造成严重破坏。也许我遗漏了什么。

    但好吧。。。忘了我读过,甚至试着重写那些方法。我这样做并为每个返回TRUE(我记录URL以便查看传入的内容),在您选择文件名后,在“另存为”上会出现此错误。。。

    2009-10-28 14:31:51.548 XPanel[1001:a0f] dataOfType:error: is a subclass responsibility but has not been overridden.
    

    …但是当你查看文档时,它说默认实现抛出了一个异常,因为你必须重写上面的其他实现之一。。。很明显我就是这么做的!另外,这不能用简单的数据来表示!

    因此,在这里抓住了救命稻草,我也重写了这个,并返回了nil,因为同样,你不能代表我对NSData对象的操作。然后我收到一条“无法保存”的信息。

    世界跆拳道联盟?!为什么要叫那个东西呢??!!

    现在,如果你能给我一个简单的例子,也许不读或写一个文件,而只是记录网址,那将是完美的。不是很有用,但还是应该有用。。。我只是好像没法实现。

    推荐文章