我正在尝试在 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/