【问题标题】:NSBundle, can it be used to save a project document?NSBundle,可以用来保存项目文件吗?
【发布时间】:2011-01-27 08:42:14
【问题描述】:

我正在构建一个可用于创建“项目”的 Mac OS X 应用程序。当用户保存项目时,他们将保存许多资源:图像文件、文本文件、sqlite 文件等。

我可以在 Documents 中为每个项目创建一个文件夹,在该文件夹中我可以放置所有项目资产,并且只包含一个用于打开项目的项目文件。

我已经阅读了我想使用的 NSBundle。但我只在应用程序包的上下文中阅读过它们。是否可以以这种方式使用 NSBundle?用户只能看到一个文件,并且可以将其移动到任何他们喜欢的地方。

使用 NSBundle 做我正在尝试的事情是否有意义?还是有其他方法可以做到这一点?

(我对 MacOS X 编程相当陌生)

更新

我相信 iPhoto 使用这种方法来存储“iPhoto Library”,这就是我想对我的应用程序做的事情,我应该研究 NSBundle 吗?

【问题讨论】:

  • 很多 Apple 自己的应用程序都使用文档包。旧版本的 iWork 创建了未压缩的捆绑包,iWork '09 压缩了最终捆绑包。 (您可以通过将任何 Pages 文档重命名为 *.zip 来进行测试。存档实用程序会将其解压缩为一个文档包)

标签: objective-c cocoa macos nsbundle


【解决方案1】:

是的,这是可能的,并且过去曾在不少应用程序中使用过。该方法在this document 中有描述。一旦在您应用的 Info.plist 中明确声明,Finder 会将生成的捆绑包显示为一个文件。

但是,我不建议您这样做。 Apple 自己的 Keynote 过去使用捆绑方式,但现在不再使用。同样,OmniGraffle(它是 OS X 上历史悠久的图表应用程序)使用包来保存项目,但它也停止了这样做。

原因是捆绑包仍然被非 Apple 电子邮件软件或任何浏览器等视为目录,尽管 Finder 将其显示为文件。如果用户想要将您的文档以捆绑格式附加到他/他正在浏览器中的 Gmail 中撰写的电子邮件中,那将是一团糟。这让很多人感到困惑。

所以,这是可能的,但我不建议这样做。一种方法是将压缩包用作用户可见文件,并在用户将其打开到临时目录时将其解压缩。然后您可以使用NSBundle 和/或NSFileWrapper api 访问其中的文件。

【讨论】:

  • 感谢 Yuji,很高兴听到这种方法的背景。我确实觉得你提到的 zip 方法很有吸引力。确实,我的应用程序的用户很可能有兴趣相互分享他们的工作,并且将来这可能会在 Mac 和 Windows 用户之间进行。
【解决方案2】:

Apple 的 File Wrapper 示例似乎正是您想要的: http://developer.apple.com/library/mac/#samplecode/PersistentDocumentFileWrappers/Introduction/Intro.html

它还演示了如何在包中保存 Core Data 持久存储。如果您只想存储资源,则可以省略该部分。

【讨论】:

    【解决方案3】:

    NSBundle 类代表应用程序包,可用于访问应用程序内的资源,但您希望它用于应用程序数据,而不是用户数据。

    对于您提到的每个资源,都有一种保存这种类型的方法,例如,对于图像文件,您可以使用 NSData 将图像数据保存到磁盘,对于文本文件,您可以可以使用writeToFile:atomically:encoding:error:的方法。

    您可能很想看看 Core Data (http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/cdProgrammingGuide.html),这是一个非常好的管理用户数据模型的框架,看看它是否符合您的需求。 p>

    【讨论】:

    • 不仅仅是应用程序包;框架和大多数插件也是捆绑包。
    • 当然,好点。尽管在 Rew 的情况下,这是一个应用程序包。
    • 我说的是使用包来存储由我的应用程序创建的文档,就像在 iPhoto 示例中一样。
    • Rew,这不是一个 bundle,它是一个 package。正如 weicshel 所暗示的,你想要NSFileWrapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多