Objective c 从Interface Builder连接NSMenuItems的最佳方法?
所以我花了一些时间查看CocoaDev,阅读NSMenuItems上的Cocoa文档,并在Interface Builder中进行一些测试 在我的应用程序中,我在Interface Builder中设计了一个应用程序菜单([NSApp Main menu])。我看到了三条可能的途径:Objective c 从Interface Builder连接NSMenuItems的最佳方法?,objective-c,nsmenuitem,first-responder,Objective C,Nsmenuitem,First Responder,所以我花了一些时间查看CocoaDev,阅读NSMenuItems上的Cocoa文档,并在Interface Builder中进行一些测试 在我的应用程序中,我在Interface Builder中设计了一个应用程序菜单([NSApp Main menu])。我看到了三条可能的途径: 将我的操作响应程序放入NSApplicationLegate。这对我来说似乎很奇怪,一部分是因为它在食物链上的位置很高,另一部分是因为它似乎被拴住了 创建一个子视图,用于侦听各种NSMenuItem操作消息。这看起
谢谢 我通常只在应用程序控制器(
NSApp
delegate)中公开iActions
,并将菜单项连接到这些操作。这是一种相当标准的做事方式。如果您有很多菜单项,您还可以将功能分解为一个或多个连接到应用程序控制器的控制器,并将菜单项连接到它们。这实际上取决于应用程序的体系结构。一般来说,只要有意义,就实施行动。行动消息的响应者链在这方面可以帮助您
如果应用程序不是基于文档的,则操作消息的响应者链如下所示:
NSApp
NSViewController
子类中:
NSResponder *nextResponder = [[self view] nextResponder];
[[self view] setNextResponder:self];
[self setNextResponder:nextResponder];
这将在视图和原始视图的下一个响应程序之间的响应程序链中插入self
(NSViewController的子类的实例)
请注意,您的第三种方法没有本质上的错误,即为(一部分)操作消息指定一个特定的目标。响应器链的存在为不同的对象提供了处理操作消息的机会,因为某些操作可能依赖于上下文。例如,“文件”菜单下的操作通常应用于当前为主窗口的窗口,因此没有特定目标而使用响应器链是有意义的。另一方面,ApplicationName菜单下的操作是真正的全局操作,它们不需要经过响应程序链,因此您可以将它们连接到特定目标。谢谢!我忽略了setNextResponder的功能,这使得事情看起来不像现在那么灵活。由于您和mipadi都提到可以将这些内容放入app delegate中,因此我将在此处粘贴我的全局内容。+1感谢您提供的信息。。经过长时间的搜索和努力,我找到了这个答案。当我尝试实现第三种方法时,我的菜单项是灰色的。为什么会这样?谢谢米帕迪。你提到要把控制器分为几个分包商,这让我想起来了!