【问题标题】:Creating an application that can open files of a given format创建可以打开给定格式文件的应用程序
【发布时间】:2019-08-10 02:06:13
【问题描述】:

我有一个用 Obj-C 编写的应用程序。 info.plist 包含应用程序可以打开的文件类型列表。我很确定这是可行的,因为当我尝试拖动不可接受类型的文件时,应用程序不会突出显示,但是当我拖动可接受类型的文件时,它会突出显示,并让我放下。

当我放下时,应用程序会正确启动,但是,我会看到一个对话框:

无法打开文档“foo.tiff”。 DocView 无法打开“TIFF 文件”格式的文件。

我的 info.plist 中有这个

<key>CFBundleTypeExtensions</key>
<array>
   <string>tif</string>
   <string>tiff</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>TIFFFile.icns</string>
<key>CFBundleTypeName</key>
<string>TIFF File</string>
<key>CFBundleTypeOSTypes</key>
<array>
   <string>TIFF</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Documents/</string>

谢谢。

【问题讨论】:

  • &lt;string&gt;tif&lt;/string 是错字吗?如果不是,可能是一个问题...
  • 是的,我重新格式化时它一定被删除了抱歉。已更正。

标签: objective-c macos plist file-type


【解决方案1】:

您的应用是否真正处理文件打开?

如果是NSDocument应用,需要实现readFromData:ofType:error:等其中一种文件读取方式。在普通的 NSApplication 中,您的应用程序委托应在 application:openFile: 中处理它。在这两种情况下,您都需要返回 YES 以确认您已成功打开文件。

如果你已经实现了,消息是否正在发送?

【讨论】:

  • 我有一个 Document 类,它是 NSDocument 的子类。我有两个 readFromData:ofType:errors: 和 readFromURL:ofType:errors。似乎都没有被调用。
  • 很公平。无论如何,JWWalker 可能已经成功了。
  • 是的,他 application:openFile 是我需要走的路。谢谢!
【解决方案2】:

首先,您显示的 Info.plist 的部分在 CFBundleDocumentTypes 数组中,而不是在 Info.plist 的顶层,对吧?

其次,在 LSHandlerRank 下有 Documents/,这不是合法值,Documents 也不是。

第三,你可能需要添加 NSDocumentClass。

【讨论】:

  • 我需要在哪里添加NSDocumentClass?我有一个 Document 类,它已经从 NSDocument 子类化了......
  • 这是字典中的另一个键,其中包含您发布的条目:&lt;key&gt;NSDocumentClass&lt;/key&gt; &lt;string&gt;YourDocumentClassName&lt;/string&gt;
  • @Brian 那么你想要实例化哪个并发送read... 消息以打开 TIFF 文件?
  • @walkytalky 问题是直到我真正打开文件我才真正知道...我有三种 .tiff 文件、多页 tiff、单页图像和文档在多个文件中,每页一个(img-001 img-002 img-003 等),直到我打开文件才知道...
  • @Brian:在那种情况下,我猜你不想指定 NSDocumentClass。在application:openFile: 等应用程序委托方法中接收文件,然后确定要使用哪种文档。
【解决方案3】:

有时让我印象深刻的另一件事是您需要包含 $(PRODUCT_MODULE_NAME)。在你的班级名称之前。如果您在 Swift 项目中使用 10.2.1 中的下拉菜单,Xcode 似乎不会在该字段中为您的类放置一个完全限定的名称。在以前的版本中确实如此。

我也怀疑,但还没有证明文档继承的类和任何类都需要是 Public 或 Open。​​

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2018-06-28
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多