macos - NSMenu 初始值设定项或 didLoad 等效项?

标签 macos cocoa nsmenu

我正在尝试在 OS X 上构建一个菜单栏应用程序,当单击具有自定义数量的 NSMenuItems 的菜单栏图标时,会显示 NSMenu。数量是在设置窗口中指定的,我认为携带此数字的最佳方法是将其保存到 NSUserDefaults 并在值更改时发送 NSNotificationCenter 通知,因此负责设置和保存数据的 Controller 当收到通知时,NSMenu 可以从默认值加载此值。

我在这里遇到的问题是我不确定如何告诉菜单 Controller 订阅通知。因为我只是将 NSMenu 子类化,所以我实际上没有一个可以完成此操作的初始化程序。或者相当于 NSWindowControllers 具有的 didLoad 方法。

另一种选择是让菜单 Controller 成为单例并直接与其对话,而无需通过通知中心。或者在应用程序委托(delegate)中引用它,这在此处相当于相同的事情。

或者也许我完全想太多了,并且有更简单的方法来处理这个问题?

感谢您的帮助和提示!

最佳答案

当然NSMenu有一个初始化器。所有类(class)都如此。

您可能在 NIB 中实例化了菜单。在这种情况下,加载 NIB 将通过调用 -initWithCoder: 来初始化菜单,这是 NSMenu 作为采用 NSCoding 协议(protocol)的一部分而实现的。

如果您在代码中实例化菜单,那么您必须调用初始化程序作为其中的一部分(您调用 [[NSMenu alloc] init...],其中 init ... 是一些特定的初始值设定项)。

您的通知方案应该可以正常工作。

您还可以让应用程序 Controller 在设置窗口和菜单之间进行调解。它将有一个菜单导出,因此它可以调用任何适当的方法,包括由您的子类添加的方法。

关于macos - NSMenu 初始值设定项或 didLoad 等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30184563/

相关文章:

objective-c - 在 Objective-C 中获取文件的大小

Eclipse CTRL+A, CTRL+E 转到开头 转到行尾

objective-c - 以编程方式为 NSStatusBar.systemStatusBar 创建 NSMenu

cocoa - 将焦点设置在 NSMenu 中的 NSTextField 上?

cocoa - 显示表格时可用的主菜单

javascript - 如何在 osx 上的 Atom 中设置新的键绑定(bind)

objective-c - 如何调暗/禁用当前 View ?

objective-c - RestKit - RKObjectManager 中未声明的标识符 'DISPATCH_QUEUE_SERIAL'?

objective-c - 应用程序包之外的应用程序引用框架

objective-c - 设置 NSToolbarItem 未选中