关于使用menuWillOpen
有很多相关的答案。他们都解释说,首先需要设置菜单的代表。
当我只有一个目标(例如“首选项”窗口或主应用程序)时,这很容易。
但是,如果我有一个基于文档的应用程序,并且需要活动文档句柄menuWillOpen
,该怎么办?然后委托不再是常量。
处理此问题的正确方法是什么?我是否必须将委托设置为单个对象(例如AppDelegate),然后将调用转发到活动视图控制器(但是如何正确完成)?还是还有其他优雅的方式?
答案 0 :(得分:0)
我想出了似乎可行的代码:
// This is in my AppDelegate class, and the NSMenu's delegate points to it:
- (void)menuWillOpen:(NSMenu *)menu {
// Forward to active document controller
NSWindow *mainWindow = [NSApplication sharedApplication].mainWindow;
NSResponder *r = mainWindow.firstResponder;
while (r) {
if ([r respondsToSelector:_cmd]) {
[(id<NSMenuDelegate>)r menuWillOpen:menu];
return;
}
r = r.nextResponder;
}
}
它假定响应者链下的控制器实现了menuWillOpen: