如何在另一个程序的窗口上发布可可粉?
使用Apple OS X Cocoa框架,如何在另一个过程的窗口上张贴工作表(向下模式对话框)?
编辑:澄清了一下:
我的应用程序是一个Finder扩展,可以执行Subversion版本控制(http://scplugin.tigris.org/)。我的应用程序的一部分是插件(Finder的上下文菜单项);但是,我的应用程序大部分都在单独的守护进程中。由于多种原因,我们选择将几乎所有代码都放入守护程序中。该插件仅定义菜单本身,并将Apple-Events移交给守护程序。
有时,守护程序需要提示用户进一步的信息。它可以为此在屏幕上扔一个窗口,但这是破坏性的(位置随机),在我看来,这里的工作流程是合法的模式,例如"选择文件,从菜单中选择'提交',提供提交评论,进行操作。"
进程间的合作(例如传递某种类型的引用)是可以接受的:这两个进程都是我的,但我想避免将工作表的代码绑定到主进程中。
解决方案
回答
确实,这听起来像是我们在尝试在视图级别进行进程间通信,但这实际上并不是Cocoa的工作原理。如果我们将图层分开得更多,事情将会变得容易得多。
我们为什么不希望将工作表代码放入其他过程中?它是视图代码,并且视图代码本质上是特定于进程的。正确的做法可能是在插件代码中添加一些通用的模式表支持,以及守护程序可以调用的IPC调用以调用该代码。如果我们可以使视图对象完全正常运行,那么尝试将视图对象交付给远程过程将是噩梦。
我们正在使用这种方法来应对框架。
回答
请不要这样做。尽可能使交互成为非模态交互。尤其是在诸如提交之类的事情中,编写提交注释时能够浏览文件会更好。
OS X确实具有窗口组,但是我认为它们不能(轻松地)跨越应用程序。
回答
我们不能在另一个过程中向窗口添加工作表,因为在另一个过程中我们最多只能访问窗口。
回答
要考虑的另一件事是,在OS X中可能会在同一文件夹上打开许多Finder窗口(与OS 9不同)。即使我们确实有足够的特权/ API将工作表添加到Finder窗口中,也不像该窗口的模式会阻止用户继续使用文件。
(作为Mac的长期用户,我个人的看法是,这种互动将使我无所适从。)