8

Cocoa 曾经在 CS3 上工作,其技巧是将 Cocoa 包放入主 Carbon 插件包中,从 Carbon 加载它并发出 NSApplicationLoad()。那是因为 Photoshop CS3 仅支持 Carbon 并且用于卸载插件包。

Photoshop CS4 使用 Cocoa 并在主线程上有自己的 NSAutorelease 池。

在 Photoshop CS4 上,由 NSWindowController 加载的非常简单的基于窗口的 xib/nib 开箱即用。

但是,只需将绑定添加到窗口上的控件,您就会遇到有趣的崩溃,可以选择在您关闭窗口时,或者在您第二次使用插件时,甚至在关闭 Photoshop 本身时。

为什么在我使用一些高级 Cocoa 功能之前一切似乎都运行良好?我被困住了。

编辑:我真的找到了解决更广泛问题“如何在 Photoshop CS3/CS4 插件中使用 Cocoa?”的解决方案。见下文。

4

3 回答 3

1

您必须创建一个新的可加载捆绑目标,其中包含您的 nib 和 Cocoa 代码。将捆绑产品添加到插件的复制捆绑资源阶段。然后,用于加载带有一些控件的 Cocoa 窗口的过滤器插件的代码将是:

Boolean DoUI (void) {

    // Create the CF Cocoa bundle
    CFBundleRef pluginBundle;
    CFURLRef cocoaBundleURL;
    pluginBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.example.plugin"));
    cocoaBundleURL = CFBundleCopyResourceURL(pluginBundle, 
                                             CFSTR("Cocoa_bundle"), 
                                             CFSTR("bundle"), 
                                             NULL);
    CFBundleRef cocoaBundleRef;
    cocoaBundleRef = CFBundleCreate(kCFAllocatorDefault, cocoaBundleURL);
    CFRelease(cocoaBundleURL);

    // start Cocoa (for CS3)
    NSApplicationLoad(); 

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // load the cocoa bundle by identifier
    NSBundle* cocoaBundle;
    cocoaBundle = [NSBundle bundleWithIdentifier:@"com.example.plugin.cocoa"];

    // load the window controller from the bundle
    Class testControllerClass;
    testControllerClass = [cocoaBundle classNamed:@"MyWindowController"];

    MyWindowController* winController = [[testControllerClass alloc] init];
    [NSApp runModalForWindow:[winController window]];
    [[winController window] performClose:nil];
    [winController release];

    // release the bundle
    CFRelease(cocoaBundleRef);

    [pool release];

    return 1;
}

这是基于 Craig Hockenberry捆绑技巧。我仍在测试它,但它应该适用于 CS3 和 CS4。

于 2009-07-10T17:35:50.137 回答
0

我刚开始为 CS4 编写一个基于 Cocoa 的插件。真的,几乎没有关于这个主题的信息,我一直在弄清楚。

  • 从这个 Apple 示例开始,确保下载整个项目,因为文本中缺少一些小细节:

碳/可可

  • 选择一个 Photoshop SDK 示例(我使用了 ColorMunger),并保持简单的开始,因此只需尝试替换“关于”对话框,使用 Apple 示例作为模板。一旦你在没有内存问题的情况下工作,你就应该开始了。

我已经做了 10 年的 Java 和 Ruby 程序员,所以我的 C/C++ foo 已经生锈了,而我只是在学习Objective C。我遇到了两个“陷阱”,以防万一......

  • 不要在您的 NIB/XIB 文件中创建控制器对象。因为,基于那个 Apple 示例,控制器在它的 init 方法中打开 NIB 文件,你会得到一个非常有趣的递归循环
  • Apple 示例将 Cocoa 内容嵌入到基于 Carbon 的 C 应用程序中。Adobe 示例都是 C++。不要忘记头文件中的 extern "C" {}。
于 2009-07-10T16:54:36.147 回答
0

CS2 将像 CS3/CS4 一样容易地加载 PowerPC Mach-O 代码。有人在 CS2 中测试过这种 Cocoa 方法吗?

目前我将 Carbon 用于 CS2/CS3/CS4,因为它保证在插件加载的任何地方都可以工作;当然还有 Cocoa for CS5,无论是 32 位还是 64 位。

Chris Cox 不看好 Cocoa 在 CS5 以外的任何领域: http ://forums.adobe.com/message/3256555#3256555

那么这里真正的交易是什么?很难忽视马嘴里的建议。

于 2010-11-03T17:18:50.400 回答