2

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

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

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

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

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

更新

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

4

3 回答 3

4

是的,这是可能的,并且过去曾在很多应用程序中使用过。该方法在本文档中进行了描述。一旦在您的应用程序中明确声明Info.plist,Finder 会将生成的捆绑包显示为一个文件。

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

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

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

于 2011-01-27T08:57:06.913 回答
2

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

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

于 2011-01-27T08:58:25.257 回答
0

NSBundle类代表应用程序包,可用于访问应用程序中的资源,但您会使用它来访问应用程序数据,而不是用户数据。

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

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

于 2011-01-27T08:57:19.670 回答