【问题标题】:menuWillOpen: and menuDidClose: not invoked for NSMenuDelegatemenuWillOpen: 和 menuDidClose: 不为 NSMenuDelegate 调用
【发布时间】:2016-07-25 02:39:32
【问题描述】:

[编辑] Willeke 指出它是menuDidClose: 而不是menuWillClose:。我的代码实际上有那部分是正确的。更正帖子以防其他人发现此研究存在类似问题。

我确定这只是 Cocoa 新手的问题,但我已经为此绞尽脑汁好几个小时了。我已经阅读了 NSMenu 和 NSMenuDelegate 文档几次,试图弄清楚我缺少什么,但它看起来很简单。

我有一个带有工具栏和三个视图的首选项窗口的窗口控制器。窗口控制器被声明为 NSMenuDelegate。

@interface PrefsController : NSWindowController <NSMenuDelegate, NSWindowDelegate, NSOpenSavePanelDelegate>

此问题是第一个视图上的 NSPopUpButton。与 popupbutton 关联的菜单工作正常。我可以通过关联的 IBOutlet 变量修改菜单等。它绑定到共享用户默认控制器以获取选定的值,并且工作正常。

但是在访问菜单时不会调用menuWillOpen:menuDidClose: 方法。

- (void)menuWillOpen:(NSMenu *)menu {
    if (menu == myPopupButton.menu) {
        [self updateMenuImages:NSMakeSize(32, 32)];
    }
}


- (void)menuDidClose:(NSMenu *)menu {
    if (menu == myPopupButton.menu) {
        [self updateMenuImages:NSMakeSize(16, 16)];
    }
}

对于我几乎可以肯定是一个愚蠢的错误,我深表歉意,但我很难过。

【问题讨论】:

  • 我通常忘记连接代理。在弹出按钮的情况下,我会使用NSPopUpButtonWillPopUpNotification 和弹出按钮的操作。它是menuDidClose:
  • 感谢您的回复。我的代码实际上有menuDidClose:。我在这里和其他网站上阅读了很多关于 NSMenuDelegate 方法的内容,我在写这篇文章时犯了错误。现在我已经睡了一会儿,我正在重新查看代表连接。 ;)
  • NSPopUpButtonWillPopUpNotification 确实被调用了。不幸的是,代码直到显示菜单后才运行,我找不到相应的 DidClose 方法。我无法将文件所有者委托连接到弹出按钮本身。父窗口已连接。 NSPopUpButtonWillPopUpNotification 确实被调用的事实让我相信弹出按钮的代表已正确连接,而不是嵌入在弹出按钮中的菜单?
  • myPopupButton.menu.delegate = self 在初始化中
  • 可以在XIB中连接菜单的代理。菜单和弹出按钮是两个独立的对象。

标签: objective-c cocoa


【解决方案1】:

菜单委托并不经常使用,因此 Apple 并没有让它们在 Interface Builder 中易于设置。相反,请在 awakeFromNib 中执行此操作:

myPopupButton.menu.delegate = self;

【讨论】:

  • 谢谢!那解决了它。我一定尝试了四种不同的方法来做同样的事情,但错过了我需要弹出菜单的委托这一事实。事后看来,这很明显。 :)
猜你喜欢
  • 2019-09-23
  • 2016-11-22
  • 2013-06-04
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多