【问题标题】:Best way to wire up NSMenuItems from Interface Builder?从 Interface Builder 连接 NSMenuItems 的最佳方法是什么?
【发布时间】:2011-05-06 21:22:40
【问题描述】:

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

在我的应用程序中,我有一个在 Interface Builder 中设计的应用程序菜单 ([NSApp mainMenu])。我看到了三种可能的路径:

  1. 将我的操作响应器放在 NSApplicationDelegate 中。这对我来说似乎很奇怪,部分是因为它位于食物链的上游,部分是因为它似乎是固定的。

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

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

抱歉,问题太长了。有首选方法吗? 谢谢!

【问题讨论】:

    标签: objective-c nsmenuitem first-responder


    【解决方案1】:

    这实际上取决于您的应用程序的架构。作为一般规则,在任何有意义的地方实施行动。操作消息的响应者链可以在这方面为您提供帮助。

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

    1. 哪个响应者是第一响应者
    2. 查看层次结构
    3. 窗口
    4. 窗口控制器
    5. 窗口委托
    6. NSApp
    7. 应用程序委托

    如果它们对整个应用程序真正是全局的,我只会在应用程序委托中使用操作。否则,如果它们对特定窗口有意义,我将它们放在窗口控制器(通常也是窗口委托)中,如果它们对特定视图有意义,我将它们放在视图控制器中。

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

    NSResponder *nextResponder = [[self view] nextResponder];
    [[self view] setNextResponder:self];
    [self setNextResponder:nextResponder];
    

    这会在视图和原始视图的下一个响应者之间的响应者链中插入selfNSViewController 的子类的一个实例)。

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

    【讨论】:

    • 谢谢巴伐利亚!我忽略了 setNextResponder 功能,这让事情看起来不如实际灵活。由于您和 mipadi 都提到可以将这些内容放在应用程序委托中,所以我将把我的全局内容放在那里。
    • +1 感谢您提供此信息.. 经过长时间的搜索和努力,我找到了这个答案
    • 当我尝试实现第三种方法时,我的 menuItem 是灰色的。为什么会发生?
    【解决方案2】:

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

    【讨论】:

    • 谢谢米帕迪。你提到将控制器分解为子控制器让我思考!
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 2018-08-20
    • 2010-09-23
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多