繁体   English   中英

通过双击或右键单击Cocoa app打开文件

[英]Cocoa app open file via double-click or right-click

我正在创建一个非基于文档的应用程序,可以打开和显示各种图像类型。 在我的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帖子并遵循这些建议,但没有一个有效。 有没有人知道为什么会这样?

我知道这是一个老问题,但以防万一:我在上面注册之后才开始工作,并在Imported Type 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中,当用户右键单击文件并选择Open With时,我在AppDelegate中收到以下方法的调用(无论是否需要该应用程序)是否开放)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM