2010-11-04 69 views
1

也许我是以这种错误的方式来的,但在我的应用程序中,我有可加载的包,它将NSMenuItem条目添加到主菜单。applicationDidFinishLaunching:在从NIB加载NSDocument后执行

我遍历所有包并确定要添加的菜单项,然后相应地添加它们。

现在的问题是,这些代码应该放在基于文档的应用程序中去哪里?

起初,我把它放在我NSDocument子类-windowControllerDidLoadNib:方法,但是这有重复相同的项目n时代不需要的副作用,其中n是我打开的文档数(即它不是一个运行一个放置代码的地方)。

于是我试图把代码在我NSApplicationDelegate-applicationDidFinishLaunching:方法,它确实意味着它只能运行一次,但在文档跳起并显示-applicationDidFinishLaunching:执行我现在面临一个问题(或者至少在它结束之前)。

哪里有放置代码的权利,可以在启动时动态地将菜单项添加到基于文档的应用程序?

回答

1

为每个创建/打开的文档调用-windowControllerDidLoadNib:方法。这是更多的应用程序级别,因此文档不应该担心这一点。

如何使用-menuNeedsUpdate:委托方法在显示时更新菜单?这样,您的应用程序可以简单地维护它在启动时创建的列表并保持菜单更新。或者,你可以把它放在你的应用代理的方法-awakeFromNib中。

+0

-menuNeedsUpdate:看起来很有帮助,谢谢。但是,这是如何在多文档应用程序(例如我的)中发挥作用的,每个文档都要对菜单进行更改?似乎相当有限,它是一个委托,而不是一个通知,因此多个对象可以响应。当用户在文档之间切换时,我需要调整各种菜单项的状态。 – d11wtq 2010-11-04 15:09:56

+0

划痕。看起来像是发送了“NSMenuDidBeginTrackingNotification”。我的不好:) – d11wtq 2010-11-04 15:11:43

+0

所以你的文档*确实对插件菜单的状态有一个发言权?我想你需要更详细地阐明你的问题。 – 2010-11-04 15:20:20