如何在 Cocoa 中创建仅导入文档类型?
我的应用程序导入但未保存一种文件类型。 我已向文档类型添加了一个条目并将其设置为只读,但这并没有产生我正在寻找的导入行为。 相反,我的应用程序只会打开文件,当我保存时,原始文件会以我自己的文件格式覆盖。
如何设置我的文档或文档类型,以便使用原始文档中的数据创建新文档,而不是打开原始文档?
There's a file type my application import but not save. I've added an entry to the document types and set it to read-only, but that doesn't yield the import behaviour that I'm looking for. Instead, my app will just open the file and when I save the original file is overwritten in my own file format.
How to set up my document or document types to make it so that a new document is created with the data from the original document, instead of the original being opened?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Alex,谢谢你的回答,但我找到了一种我更喜欢的方法:
这样仍然可以使用 Cocoa 提供的文档系统,而不是滚动我自己的文档系统。
我还在这里记录了解决方案: http://www.cocoadev.com/index.pl? CFBundleTypeRole 位于页面下方。
Alex, thanks for your answer, but I found a way that I like a bit more:
This way it's still possible to use the document system provided by Cocoa instead fo rolling my own.
I've also documented the solution here: http://www.cocoadev.com/index.pl?CFBundleTypeRole a bit down the page.
我不认为 Cocoa 默认支持导入功能。 当用户单击打开面板中的“打开”按钮时,框架会调用
NSDocumentController
上的openDocumentWithContentsOfURL:display:error:
。 文档系统在这里确定您要打开的文件类型,并咨询 Info.plist 文件以确定使用哪个NSDocument
子类来打开文档。您可以子类化 NSDocumentController 并重写 openDocumentWithContentsOfURL:display:error: 方法来拦截应导入而不是打开的文件类型。 在您的 NSDocument 子类中,编写一个新的初始化程序,其名称如
initWithImportedContentsOfURL:type:error:
(或更好的名称:-))来创建一个新的无标题文档并读入导入文件的内容。I don't believe that import functionality is supported by default in Cocoa. When the user clicks the Open button in the open panel, the framework calls
openDocumentWithContentsOfURL:display:error:
onNSDocumentController
. This is where the document system figures out what type of file you're opening and consults with the Info.plist file to figure out whichNSDocument
subclass to use to open the document.You could subclass
NSDocumentController
and override theopenDocumentWithContentsOfURL:display:error:
method to intercept the file types that should be imported rather than opened. In yourNSDocument
subclass, write a new initializer with a name likeinitWithImportedContentsOfURL:type:error:
(or something with a better name :-) ) to create a new untitled document and read in the contents of the imported file.1. 将文件类型声明为文档类型
在 Xcode 项目中,为应用程序支持的所有文件格式添加文档类型。 根据应用程序的功能设置每种类型的角色:将
将类别设置为您要处理每种文件类型的文档类型。 一个文档类可以处理多种文件类型。
在下面的示例中,声明了三种文件类型:font-pestle、otf 和 ttf。 第一个是 font-pestle,是应用程序的本机格式。 该类型具有编辑者角色。
其余两种格式 otf 和 ttf 可以导入,但不能由应用程序写入; 因此他们被标记为查看者。
2. NSDocument 子类中的其他文件类型
添加文档类型后,应用程序将自动允许用户打开指定类型的文件。
您需要将文件类型处理代码添加到文档类中。 在理想情况下,将分支代码添加到
readFromData:ofType:error:
方法中:self.fileURL = nil;
很重要。 通过将 fileURL 设置为 nil,您表示该文档不与任何磁盘上的文件关联,应将其视为新文档。要允许自动保存,请实现 NSDocument 方法
auto savingFileType
以返回主要文件类型。1. Declare the file types as Document Types
Within your Xcode project, add a Document Type for all the file formats your application supports. Set the Role of each type according to your application's abilities:
Set the Class to the document type you want to handle each file type. One document class can handle multiple file types.
In the example below, there are three file types declared: font-pestle, otf, and ttf. The first, font-pestle, is the native format of the application. This type has the role Editor.
The remaining two formats, otf and ttf, can be imported but not written by the application; thus they are marked as Viewer.
2. Additional file types in your NSDocument subclass
With the Document Types added, the application will automatically allow users to open files of the specified types.
You need to add file type handling code to your document class. In the ideal case, add the branching code to the
readFromData:ofType:error:
method:The
self.fileURL = nil;
is important. By setting fileURL to nil, you are saying the document is not associated with any on-disk file and should be treated as a new document.To allow auto-saving, implement the NSDocument method
autosavingFileType
to return the primary file type.