2011-01-27 3 views
2

Я создаю приложение Mac OS X, которое можно использовать для создания «проектов». Когда пользователь сохраняет проект, они будут сохранять много ресурсов: файлы изображений, текстовые файлы, файлы sqlite и т. Д.NSBundle, может ли он использоваться для сохранения документа проекта?

Я могу либо создать папку в документах для каждого проекта, и внутри этой папки я могу разместить весь проект активов и просто включить один файл проекта, который используется для открытия проекта.

Я читал о NSBundle, который я бы хотел использовать. Но я только читал о них в контексте пакетов приложений. Можно ли таким образом использовать NSBundle? Если пользователь видит только один файл и может перемещать его, где захочет.

Имеет ли смысл делать то, что я пытаюсь, используя NSBundle? Или есть другой способ сделать это?

(я довольно новыми для MacOS программирования X)

UPDATE

Я считаю, что Iphoto использует этот метод для сохранения «Iphoto библиотеки», это то, что я хотел бы сделать с мое приложение, NSBundle, на что я должен смотреть?

+0

Многие приложения Apple используют пакеты документов. В старых версиях iWork созданы несжатые пакеты, iWork '09 застегивает последний пакет. (вы можете проверить это, переименовав любой документ Pages в * .zip. Утилита архива распакует его в пакет документов) –

ответ

4

Да, это возможно и использовалось в довольно многих приложениях в прошлом. Способ описан в this document. Как только он четко объявлен в вашемприложениях, Finder покажет полученный пакет как один файл.

Однако я не могу рекомендовать вам это сделать. Собственная Keynote от Apple использовала подход пакета в прошлом, но он больше не использует его. Точно так же OmniGraffle (который является графическим приложением в OS X с длинной историей) использовал пакеты для сохранения проектов, но он тоже прекратил это делать.

Причина в том, что пакет по-прежнему рассматривается как каталог с помощью программного обеспечения электронной почты, отличного от Apple, или любого браузера и т. Д., Хотя Finder показывает его как файл. Было бы бесполезно, если пользователь хочет прикрепить ваш документ в формате пакета к сообщению электронной почты, которое он пишет в Gmail внутри браузера. Это смутило многих людей.

Так что это возможно, но я не рекомендую его. Один из способов - использовать zipped bundle в качестве файла, видимого пользователем, и разархивировать его, когда пользователь открывает его во временный каталог. Затем вы можете использовать NSBundle и/или NSFileWrapper apis для доступа к файлам внутри него.

+0

Спасибо Юдзи, интересно услышать предысторию этого подхода. Я нахожу метод zip, который вы упоминаете довольно привлекательным. Это правда, что пользователи моего приложения могут быть заинтересованы в совместном использовании их друг с другом, и в будущем это может произойти между Mac и пользователем Windows. – Vamos

0

Класс NSBundle представляет собой набор приложений и может использоваться для доступа к ресурсам в приложении, но вы могли бы использовать данные приложения, а не данные пользователя.

Для каждого из перечисленных вами ресурсов есть способ сохранить этот тип, например, для файлов изображений, вы можете использовать NSData для сохранения данных изображения на диск, а для текстовых файлов вы можете использовать метод writeToFile:atomically:encoding:error:.

Вы очень хорошо можете взглянуть на Core Data (http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/cdProgrammingGuide.html), очень хорошая основа для управления моделью данных пользователя, чтобы увидеть, если это будет соответствовать вашим потребностям.

+0

Не только пакет приложений; рамки и большинство подключаемых модулей также являются пакетами. –

+0

Конечно, хорошая точка. Хотя в случае Rew это пакет приложений. –

+0

Я говорю об использовании пакетов для хранения документов, созданных моим приложением, как в примере iPhoto. – Vamos

2

обертка Файл образец Apple, кажется, что вы хотите: http://developer.apple.com/library/mac/#samplecode/PersistentDocumentFileWrappers/Introduction/Intro.html

Он также демонстрирует, как сохранить постоянное хранилище данных ядра в связке. Вы можете оставить эту часть, если хотите просто сохранить ресурсы.

Смежные вопросы