更新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中 - &gt;服务,我的菜单项与myproject共享显示。
问题:
一切都很好,花花公子吧?好吧不。当我点击“与myproject共享”时,没有任何反应。我在shareFile方法中设置了断点,程序正在运行,但没有任何反应,它永远不会被击中等等。
我读过我可以使用-NSDebugServices调试Finder,但我似乎无法正常工作。我执行了:
/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder -NSDebugServices com.mycompany.myproject
这似乎启动了一个过程,但我没有尝试与之交互的Finder窗口。
我不确定下一步该去哪儿。当然,想法是在发送共享时将文件名或文件内容传递给我的应用程序,然后我可以从那里完成所需的操作。
SendFileTypes是否设置正确或此模型的某些内容?任何帮助赞赏。感谢
答案 0 :(得分:0)
好的。 IRC上有人指出我的方法定义遗漏了一些东西:
- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err
它缺少一个变量定义(它可以完全搞乱选择器匹配)。所以应该是这样的:
- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*)***udata*** error:(NSString**)err
一旦我改变了,选择器最终开始被称为=)
答案 1 :(得分:0)
我遇到了同样的问题,并且能够通过删除派生数据来解决这个问题。
我认为发生的事情是我试图通过创建虚拟应用程序来测试某些东西,并且我使用相同的消息名称来进行服务。通过从虚拟应用程序中删除派生数据,一切都开始起作用。
您应该能够在此路径中的某个目录中找到派生数据:
~/Library/Developer/Xcode/DerivedData/
删除旧的东西,它可能会为你解决它。