gpt4 book ai didi

objective-c - 从 Interface Builder 连接 NSMenuItems 的最佳方式?

转载 作者:太空狗 更新时间:2023-10-30 03:37:24 26 4
gpt4 key购买 nike

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

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

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

  2. 创建一个 subview 来监听各种 NSMenuItem 操作消息。这看起来很有用,但看起来为了让它进入响应者链,可能有一些我无法理解的魔法。

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

很抱歉这个问题很长。有首选方法吗?谢谢!

最佳答案

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

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

  1. 谁是第一响应者
  2. 查看层次结构
  3. 窗口
  4. 窗口 Controller
  5. 窗口代理
  6. NSApp
  7. 申请代表

我只在应用程序委托(delegate)中使用对整个应用程序来说真正全局的操作。否则,如果它们对特定窗口有意义,我将它们放在窗口 Controller (通常也是窗口委托(delegate))中,或者如果它们对特定 View 有意义,我将它们放在 View Controller 中。

值得一提的是, View Controller (NSViewController 的子类)不会自动插入到响应链中。我在将相应的 View 添加到 super View 后手动执行此操作。例如,在 NSViewController 子类中:

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

这会将 self(NSViewController 的子类实例)插入到 View 和原始 View 的下一个响应者之间的响应者链中。

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

关于objective-c - 从 Interface Builder 连接 NSMenuItems 的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5917151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com