Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从Interface Builder连接NSMenuItems的最佳方法?_Objective C_Nsmenuitem_First Responder - Fatal编程技术网

Objective c 从Interface Builder连接NSMenuItems的最佳方法?

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操作消息。这看起

所以我花了一些时间查看CocoaDev,阅读NSMenuItems上的Cocoa文档,并在Interface Builder中进行一些测试

在我的应用程序中,我在Interface Builder中设计了一个应用程序菜单([NSApp Main menu])。我看到了三条可能的途径:

  • 将我的操作响应程序放入NSApplicationLegate。这对我来说似乎很奇怪,一部分是因为它在食物链上的位置很高,另一部分是因为它似乎被拴住了

  • 创建一个子视图,用于侦听各种NSMenuItem操作消息。这看起来很有用,但为了让它进入响应器链,可能有一些我无法理解的魔力

  • 创建一个用于侦听特定应用程序菜单内容的NSObject,将其放入xib中,并将其连接起来。在我看来,这是目前最好的解决方案,因为我可以隔离东西,而不依赖于响应链来到达特定的对象。但我想知道,当我的应用程序达到足够的复杂程度时,这是否可能是一个问题,因为它篡夺了响应者链,这可能不仅仅是因为易用性

  • 很抱歉问了这么长的问题。有没有更好的方法?
    谢谢

    我通常只在应用程序控制器(
    NSApp
    delegate)中公开
    iActions
    ,并将菜单项连接到这些操作。这是一种相当标准的做事方式。如果您有很多菜单项,您还可以将功能分解为一个或多个连接到应用程序控制器的控制器,并将菜单项连接到它们。

    这实际上取决于应用程序的体系结构。一般来说,只要有意义,就实施行动。行动消息的响应者链在这方面可以帮助您

    如果应用程序不是基于文档的,则操作消息的响应者链如下所示:

  • 无论哪个响应者是第一响应者
  • 视图层次结构
  • 窗口
  • 窗口控制器
  • 窗口代理
  • NSApp
  • 应用程序委托
  • 我只在应用程序委托中使用操作,如果它们对于整个应用程序来说是真正全局的。否则,如果它们对特定窗口有意义,我将它们放在窗口控制器(通常也是窗口代理)中,如果它们对特定视图有意义,则放在视图控制器中

    值得一提的是,视图控制器(NSViewController的子类)不会自动插入到响应程序链中。我在将相应的视图添加到superview后手动执行此操作。例如,在
    NSViewController
    子类中:

    NSResponder *nextResponder = [[self view] nextResponder];
    [[self view] setNextResponder:self];
    [self setNextResponder:nextResponder];
    
    这将在视图和原始视图的下一个响应程序之间的响应程序链中插入
    self
    (NSViewController的子类的实例)


    请注意,您的第三种方法没有本质上的错误,即为(一部分)操作消息指定一个特定的目标。响应器链的存在为不同的对象提供了处理操作消息的机会,因为某些操作可能依赖于上下文。例如,“文件”菜单下的操作通常应用于当前为主窗口的窗口,因此没有特定目标而使用响应器链是有意义的。另一方面,ApplicationName菜单下的操作是真正的全局操作,它们不需要经过响应程序链,因此您可以将它们连接到特定目标。

    谢谢!我忽略了setNextResponder的功能,这使得事情看起来不像现在那么灵活。由于您和mipadi都提到可以将这些内容放入app delegate中,因此我将在此处粘贴我的全局内容。+1感谢您提供的信息。。经过长时间的搜索和努力,我找到了这个答案。当我尝试实现第三种方法时,我的菜单项是灰色的。为什么会这样?谢谢米帕迪。你提到要把控制器分为几个分包商,这让我想起来了!