【问题标题】:Cocoa app open file via double-click or right-clickCocoa app 通过双击或右键打开文件
【发布时间】:2016-07-08 17:47:09
【问题描述】:

我正在创建一个基于非文档的应用程序,它可以打开和显示各种图像类型。在我的 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:]

阅读documentation后,它说如果用户双击一个文件,调用顺序应该是:

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

然而打开文件方法永远不会被调用。

我已经阅读了一堆其他 stackoverflow 帖子并遵循了这些建议,但没有一个有效。有没有人知道为什么会发生这种情况?

【问题讨论】:

    标签: objective-c swift macos cocoa


    【解决方案1】:

    一个老问题,我知道,但以防万一:我只是在我按照你上面所做的那样注册并在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(无论是否需要打开应用程序)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多