【发布时间】: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