【问题标题】:NSMenu initializer or didLoad equivalent?NSMenu 初始化程序或 didLoad 等效项?
【发布时间】:2015-05-12 07:35:19
【问题描述】:

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

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

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

或者也许我完全想多了,有更简单的方法来解决这个问题?

感谢您的帮助和提示!

【问题讨论】:

    标签: macos cocoa nsmenu


    【解决方案1】:

    当然NSMenu 有一个初始化器。所有课程都可以。

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

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

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

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

    【讨论】:

    • 谢谢!我不知何故没有意识到 NIB 会调用 init(coder:) 初始化程序。很有意义并解决了我的问题:)
    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2011-02-15
    • 2020-09-26
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多