如何在另一个程序的窗口上张贴Cocoa“工作表”?

问题描述:

使用Apple OS X Cocoa框架,如何在另一个进程的窗口上发布工作表(滑下模式对话框)?如何在另一个程序的窗口上张贴Cocoa“工作表”?

编辑:澄清一点:

我的应用程序是一个Finder的扩展做Subversion版本控制(http://scplugin.tigris.org/)。我的应用程序的一部分是一个插件(Finder的上下文菜单项);然而,我的应用程序的大部分是在一个单独的守护进程中。出于以下几个原因,我们选择将几乎所有代码放入守护进程中;该插件仅定义菜单本身,并将Apple-Events定义到守护程序。

有时,守护程序需要提示用户以获取更多信息。它可以在屏幕上为此折腾一个窗口,但这是破坏性的(随机定位),在我看来这里的工作流程是合法的模式,例如“选择一个文件,从菜单中选择'提交',提供提交评论,做手术。“

进程间的合作(比如传递某种引用)是可以接受的:这两个进程都是我的,但我想避免将工作表的代码绑定到主进程中。

+0

FYI:用于取景器上下文菜单项DOA在雪豹。你必须重新将它们写成服务。请参阅 geowar 2009-10-23 16:31:50

真的,这听起来像是你试图让你的进程间通信发生在视图层面,这实际上并不是Cocoa通常的工作方式。如果你将图层分开的话,情况会更容易。

为什么你不想把表单代码放入其他进程?它是视图代码,视图代码本质上是特定于流程的。在这里做的正确的事情可能是为你的插件代码添加一些通用的模式表支持,以及你的守护进程可以召唤这些代码的IPC调用。试图将视图对象传送到远程进程将会是噩梦,如果你可以使它工作。

你在用这种方法来对抗框架。

请不要这样做。如果可能的话,使交互非模态。特别是在提交之类的东西中,在编写提交评论时能够浏览文件更好。

OS X确实有窗口组,但我认为他们不能(轻松地)跨越应用程序。

您不能将工作表添加到另一个进程中的窗口,因为在其他进程中最多只能访问最多的窗口。

需要考虑的另一件事是,在OS X中可以在同一文件夹中打开许多Finder窗口(与OS 9不同)。即使你确实有足够的特权/ API来添加工作表到Finder窗口,它不像该窗口的模式将阻止用户能够继续处理文件。

(我个人的意见作为一个长期的Mac用户,这种互动将推动我的权利了墙。)