objective-c - 如何编写 OS X Finder 插件

我正在寻找编写 Mac OS X Finder 插件的指南或示例代码?它想知道如何做一些简单的 Action :

  1. 为图标添加图像叠加层
  2. 添加上下文菜单项
  3. 监听文件变化

我找到了以下两个资源:

  • Writing Contextual Menu Plugins for OS X : 2002 年的过时文档,使用面向 Mac OS X 8/9 的 COM API。
  • SCPlugin :包含 Finder 插件的开源 SVN Mac 应用程序。

我很想查看 SCPlugin 代码,但希望找到更容易消化的示例。

最佳答案

Finder Icon Overlay示例项目代表了以下答案的一个小而非常基本但实际可行的示例。

https://github.com/lesnie/Finder-Icon-Overlay

我知道这已经很老了,但有些人可能仍然对主题感兴趣(?)

这是我在 Leopard (10.6) 下所做的。首先需要适当的 Finder 标题。使用类转储工具来获取它。然后将您的代码编写为 SIMBL 插件(请参阅文档如何操作),混合一些方法。例如在 ListView 中的图标上绘制一些东西,drawIconWithFrame: TIconAndTextCell 方法的方法必须被覆盖。

这是方法调配的代码:

+ (void) Plugin_load
{
    Method old, new;
    Class self_class = [self class];
    Class finder_class = [objc_getClass("TIconAndTextCell") class];

    class_addMethod(finder_class, @selector(FT_drawIconWithFrame:),
                    class_getMethodImplementation(self_class, @selector(FT_drawIconWithFrame:)),"v@:{CGRect={CGPoint=dd}{CGSize=dd}}");

    old = class_getInstanceMethod(finder_class, @selector(drawIconWithFrame:));
    new = class_getInstanceMethod(finder_class, @selector(FT_drawIconWithFrame:));
    method_exchangeImplementations(old, new);

}

我正在用我的方法“FT_drawIconWithFrame:”覆盖“drawIconWithFrame:”方法。以下是此方法的示例实现。

- (void) FT_drawIconWithFrame:(struct CGRect)arg1
{
    [self FT_drawIconWithFrame:arg1];
    if ([self respondsToSelector:@selector(node)]) {
        if ([[[[NSClassFromString(@"FINode") nodeWithFENode:[(TNodeIconAndNameCell *)self node]] fullPath] lastPathComponent] hasPrefix:@"A"])
            [myPrettyIconOverlayImage drawInRect:NSMakeRect(arg1.origin.x, arg1.origin.y, arg1.size.height, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    }
}

本质上,它会在文件名以字母“A”开头的文件的每个图标上绘制“myPrettyIconOverlayImage”。这个逻辑由你决定。

注意这一行: [self FT_drawIconWithFrame:arg1]; 这是如何调用 'super' 以获得正常的图标和名称等。我知道,看起来很奇怪,像循环,但实际上并非如此。然后封装到 SIMBL 插件中,安装 SIMBL 并...运行。

由于 Lion 的变化,一些工作必须从头开始(创建新的“Finder.h”文件,其中包含所需的所有声明,找到合适的类和方法来覆盖),但这种技术仍然有效。

黑客愉快!

https://stackoverflow.com/questions/1294335/

相关文章:

objective-c - iOS 7 过度导航栏按钮填充

objective-c - 核心数据 "use scalar properties for prim

ios - 了解一对多的核心数据删除规则

objective-c - 实现 -hash/-isEqual :/-isEqualTo. ..:用

objective-c - Xcode:可以为协议(protocol)接口(interface)所需

iphone - 我的 iPhone Objective-C 代码如何在 UIWebView 中收到

ios - 如何在 iPhone 上显示来自 API 的 HTML 文本?

objective-c - 对 block 进行类型定义是如何工作的

ios - 不支持推送导航 Controller

iphone - 将 NSDictionary 保存到 NSUserDefaults