Cocoa应用程序如何通过双击或右键单击打开文件

4

我正在创建一款非文档类应用程序,可以打开和显示各种图像类型。在我的 Info.plist 文件中,我已经添加了支持的文件类型及其标识符(public.png、public.jpeg、public.tiff 等)。在我的 AppDelegate 中,我已经实现了 -[application:openFile:] 方法(以及 -[application:openFiles:] 方法)。

以下是我的 Info.plist 的示例:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.png</string>
        </array>
    </dict>

    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.jpeg</string>
        </array>
    </dict>

...

</array>

当我右键单击PNG文件并选择我的应用程序时,我的应用程序会打开,但既不调用 - [application:openFile:] 方法,也不调用 - [application:openFiles:] 方法。如果在我的应用程序已经打开后,我再次右键单击该文件并点击我的应用程序,则 - [application:openFiles:] 方法会被调用,并且一切正常工作。
我尝试仅实现 - [application:openFile:] 方法,一切与之前相同。只有当我仅实现 - [application:openFiles:] 方法时才是如此。当我同时实现两个方法时, - [application:openFiles:] 方法优先。
我添加了日志以查看我的应用程序在启动时如何初始化。当我的应用程序未打开且我右键单击PNG图像时,我的应用程序的方法按以下顺序调用:
- [ViewController viewDidLoad]
- [AppDelegate applicationWillFinishLaunching:]
- [AppDelegate applicationDidFinishLaunching:]

打开我的应用后,再次右键单击该图像将产生以下方法调用:

- [AppDelegate application:openFiles:]

阅读文档后,它指出如果用户双击文件,则调用顺序应为:

- [AppDelegate applicationWillFinishLaunching:]
- [AppDelegate application:openFile(s):]
- [AppDelegate applicationDidFinishLaunching:]

然而,打开文件的方法从未被调用。

我已经阅读了许多其他stackoverflow帖子,并遵循了那些建议,但它们都没有起作用。有人有任何想法为什么会发生这种情况吗?

1个回答

0
一个老问题,我知道,但以防万一:只有在像您上面注册并在“导入的类型UTIs”中进行了条目输入后,我才让我的工作。
<key>UTImportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Decision List</string>
        <key>UTTypeIdentifier</key>
        <string>com.brightscreentv.document.dlist</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>dlist</string>
            </array>
        </dict>
    </dict>
</array>

我有一个自定义的文件类型.dlist,一旦将其添加到info.plist中,当用户右键单击文件并选择打开方式时,就会在AppDelegate中调用以下方法(无论应用程序是否需要被打开)。

func application(_ sender: NSApplication, openFiles filenames: [String]) {
        if let window = NSApp.mainWindow, let vc = window.contentViewController as? ViewController {
            vc.openThese(files: filenames)
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接