Finder NSService上下文菜单错误,错误为:找不到选择器的服务提供程序



更新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设置了Document TYpes/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->Services中,我的菜单项Share with myproject就会出现。

问题:

一切都很好,对吧?没有。当我点击"与我的项目共享"时,什么都不会发生。我在shareFile方法中设置了一个断点,程序正在运行,但什么都没发生,它永远不会被击中,等等。

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

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

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

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

SendFileTypes的设置是否不正确,或者是否适用于此模型?感谢您的帮助。感谢

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

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

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

~/Library/Developer/Xcode/DerivedData/

去掉旧东西,它可能会帮你解决问题。

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

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

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

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

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

最新更新