处理NSMenuDelegate menuWillOpen以更改目标

时间:2019-05-04 22:07:13

标签: macos nsmenu

关于使用menuWillOpen有很多相关的答案。他们都解释说,首先需要设置菜单的代表。

当我只有一个目标(例如“首选项”窗口或主应用程序)时,这很容易。

但是,如果我有一个基于文档的应用程序,并且需要活动文档句柄menuWillOpen,该怎么办?然后委托不再是常量。

处理此问题的正确方法是什么?我是否必须将委托设置为单个对象(例如AppDelegate),然后将调用转发到活动视图控制器(但是如何正确完成)?还是还有其他优雅的方式?

1 个答案:

答案 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: