Cocoa:如何通过服务从Finder的上下文菜单中删除项目?

时间:2013-07-07 14:52:06

标签: objective-c macos cocoa contextmenu finder

我创建了一个服务,以便在Finder的上下文菜单中显示一个项目。

我的应用程序中有以下代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [NSApp setServicesProvider:self];
    NSUpdateDynamicServices();
}

我想使用对服务本身的操作从上下文菜单中删除该项。

我试着这样做:

NSUnregisterServicesProvider([[NSBundle mainBundle] bundleIdentifier]);

但它杀死所有服务几秒钟,当它恢复时我的服务在Finder上下文菜单的服务列表中。

如何从finder的上下文菜单中删除我的NSService项?

2 个答案:

答案 0 :(得分:0)

The documentation says

  

您不应使用此功能取消注册应用程序提供的服务。对于应用程序的服务,您应该使用NSApplication的setServicesProvider:方法,传递nil参数。

所以,除了通过applicationDidFinishLaunching:而不是nil之外,您可以执行self中的操作。 (我不知道您是否需要执行NSUpdateDynamicServices步骤。)

答案 1 :(得分:0)

例如,如果您拥有卸载程序,则可以通过以下方式从“服务”菜单中删除菜单项:

  1. 删除提供服务的应用程序(您在其中调用了[NSApp setServicesProvider:self]的应用程序)
  2. 致电NSUpdateDynamicServices()

它重建数据库并检查已注册以提供服务的应用程序的可用性。

如果没有帮助,请使用/System/Library/CoreServices/pbs -dump_pboard在Terminal中转储数据库,并查找列出的服务和URL。可能在其他地方有该应用程序的另一个副本,而聪明的系统找到了它。