【问题标题】:Finder NSService Context Menu errors with: Cannot find service provider for selectorFinder NSService 上下文菜单错误:找不到选择器的服务提供者
【发布时间】:2012-11-03 06:19:43
【问题描述】:

更新 1:越来越近

IRC 上有人提到我的 NSPortName 应该是我的应用程序,而不是 Finder。我对此进行了更改,现在我在选择上下文菜单时在我的应用程序中看到一条日志消息:

Cannot find service provider for selector shareFile:userData:error: or shareFile:: for service shareFile

考虑到我确实注册了这样一个对象,这似乎很奇怪。


我正在尝试为 Finder 设置一个 NSService 上下文菜单,以在某些文件上触发我的应用程序。

文件的扩展名是 *.acxx,操作只是为了分享。 注意:我已将捆绑包的所有引用更改为针对此发布的通用引用:com.mycompany.myproject。

我的 infoPlist 的 NSServices 部分如下所示:(注意我也为 *.acxx 设置了文档类型/UTI)

<key>NSServices</key>
    <array>
        <dict>
            <key>NSRequiredContext</key>
            <dict>
                <key>NSTextContent</key>
                <array>
                    <string>URL</string>
                    <string>FilePath</string>
                </array>
            </dict>
            <key>NSSendFileTypes</key>
            <array>
                <string>com.mycompany.myproject.acxx</string>
            </array>
            <key>NSPortName</key>
            <string>Finder</string>
            <key>NSMessage</key>
            <string>shareFile</string>
            <key>NSMenuItem</key>
            <dict>
                <key>default</key>
                <string>Share with myproject</string>
            </dict>
        </dict>
    </array>

我的代码中有一个对象设置,它定义了以下方法:

- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err

我在我的代码中的其他地方注册了这个:

// Register services
if (self.shareSvcMgr == nil)
{
    self.shareSvcMgr = [[ACAShareServiceManager alloc] init];
}
[NSApp setServicesProvider:self.shareSvcMgr];
NSUpdateDynamicServices();

现在,当我运行应用程序并确保它已使用 pbs 注册时,它看起来很好:

/System/Library/CoreServices/pbs -debug en|grep -i myproj
        NSBundleIdentifier = "com.mycompany.myproject";
        NSBundlePath = "/Users/me/Library/Developer/Xcode/DerivedData/myproject-gihhiqhnzhwqbchflymzyafwxvws/Build/Products/Debug/myproject.app";
            default = "Share with myproject";
            "com.mycompany.myproject.acxx"

因此,当我转到 Finder 并单击 *.acxx 文件时,果然在 Finder -> 服务中,我的菜单项 Share with myproject 出现了。

问题:

一切都很好,花花公子对吗?好吧,没有。当我单击“与我的项目共享”时,没有任何反应。我在 shareFile 方法中设置了断点,程序正在运行,但什么也没发生,它永远不会被命中,等等。

我读到我可以使用 -NSDebugServices 调试 Finder,但我似乎无法让它正常工作。我已经执行了:

/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder -NSDebugServices com.mycompany.myproject

这似乎启动了一个进程,但我没有尝试与之交互的 Finder 窗口。

我不确定下一步该去哪里。当然,这个想法是在发送共享时将文件名或文件内容传递给我的应用程序,然后我可以从那里做需要的事情。

此模型的 SendFileTypes 设置不正确吗?任何帮助表示赞赏。谢谢

【问题讨论】:

  • 嗨,我已经在 projectinfo.plist 文件中实现了 NSService。但是直到没有菜单项添加到finder中。你能告诉我如何解决这个问题。

标签: objective-c xcode macos contextmenu finder


【解决方案1】:

我遇到了同样的问题,并且能够通过删除派生数据来解决这个问题。

我认为发生的事情是我试图通过创建一个虚拟应用程序来测试某些东西,并且我为服务使用了相同的消息名称。通过从虚拟应用程序中删除派生数据,一切都开始工作了。

您应该能够在此路径的某个目录中找到派生数据:

~/Library/Developer/Xcode/DerivedData/

删除旧的东西,它可能会为你解决它。

【讨论】:

    【解决方案2】:

    好的。 IRC 上有人指出我的方法定义缺少一些东西:

    - (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err
    

    它缺少一个变量定义(这会完全弄乱选择器匹配)。所以应该是这样的:

    - (void)shareFile:(NSPasteboard*)pboard userData:(NSString*)***udata*** error:(NSString**)err
    

    一旦我改变了它,选择器终于开始被调用 =)

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2023-04-01
      • 2016-10-23
      • 2014-12-01
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多