Bro*_*olf 7 cocoa objective-c application-design osx-snow-leopard
我目前正在寻找解决问题,因为无法在Finder中快速创建新文件.我将开源我写的东西因为我认为Mac社区需要解决这个问题.
在Windows上,您可以右键单击,创建新的文本文件.OS X,您应该可以使用这样的服务来执行此操作:
在Snow Leopard中编写Finder 服务理论上是实现这一目标的方法,尽管我还没有找到任何示例代码.(我承认我只是简单地查看了文档).
我不确定如何开始,Apple是否在Xcode中提供服务模板.基本上我正在寻找帮助以使运行的工作服务项目.那么实现代码对于我在Obj-C中编写应该是相当微不足道的.那么我该怎么做才能创建一个新的工作服务项目呢?如果我对此有误,请告诉我正确的方法,请提供示例代码或一些步骤让我开始.
编辑:相信我们,我不是OS X菜鸟.尝试了很多应用程序来实现解决方案:PathFinder,Automator,终端等,我对它们都不满意.
我想创建一个可右键单击的菜单项来创建新文件,就像Windows一样.如果此API不允许我这样做,那么我将在必要时修改系统文件.但我宁愿这样做也不需要我攻击OS X.
可悲的事实是,当Snow Leopard发布并且开发者不满意时,Apple禁用了第三方上下文菜单项.您可以使用Automator在上下文菜单下创建服务,但它非常有限.
是的,Quicksilver是我此刻创建文件的方式,除非我在我touch ~/Desktop/file.txt
或任何地方都在终端.
如果您无法通过提供Xcode项目的源代码来编写服务来回答我的问题,请保留您对我应该如何使用计算机的意见.无论如何,我想在我自己实施之后,我可能会回答我自己的问题.
Yuj*_*uji 13
阅读服务实施指南.如果你想要一个可用的示例代码,请参阅我编写的这个项目.如指南中所述,您需要做的是安装服务处理程序:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[NSApp setServicesProvider:self];
NSUpdateDynamicServices();
}
- (void)handleServices:(NSPasteboard *)pboard
userData:(NSString *)userData
error:(NSString **)error {
if([[pboard types] containsObject:NSFilenamesPboardType]){
NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType];
// do something...
}
}
Run Code Online (Sandbox Code Playgroud)
并在你的广告中做广告Info.plist
:
<key>NSServices</key>
<array>
<dict>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Service Handling Demo</string>
</dict>
<key>NSMessage</key>
<string>handleServices</string> <!-- This specifies the selector -->
<key>NSPortName</key>
<string>services</string> <!-- This is the name of the app -->
<key>NSSendTypes</key>
<array>
<string>NSFilenamesPboardType</string>
</array>
</dict>
</array>
Run Code Online (Sandbox Code Playgroud)
它就这么简单!您可能需要手动打开System Preferences.app的"键盘快捷方式"部分中的服务条目.如果你想自动打开它,你可以写入pbs.plist
内部Library/Preferences/
,但这不是一种记录的做事方式.
问题是当您在Finder窗口中右键单击空白区域时,Finder不显示此服务项.除了注入代码之外,你无法用它做任何事情.这是Finder对服务系统的支持所固有的.如果要更改该行为,则需要在Finder.app中注入代码.那并不难.在Snow Leopard上,使用OSAX加载技巧是标准的,例如在本博文中描述.然后,您可以通过更改此Apple文档中描述的方法,使用Objective-C运行时函数来修补右键单击Finder的行为.(但我不知道Finder使用哪种方法来响应右键单击事件.)
相反,如果您可以单击Finder窗口工具栏上的按钮而不是右键单击,则可以添加一个按钮,就像在此实用程序cd-to中一样.这使用了将应用程序的图标放到Finder工具栏的功能.应用程序本身只是通过Apple事件读取最前面的Finder窗口的路径,并打开一个终端窗口.我想你可以调整这个应用程序的代码来做你想要的.
这里遵循主观的东西:
老实说,如果您只想创建一个新文件,则不必使用Objective-C编写Finder服务.Automator可以使用shell脚本和/或Applescript执行相同的操作.
如果你想在Mac上有效地管理文件,那么已经有了很好的实用工具:例如尝试使用Butler或launchbar或Quicksilver.