【问题标题】:Handling NSMenuDelegate menuWillOpen for changing targets处理 NSMenuDelegate menuWillOpen 以改变目标
【发布时间】:2019-09-23 00:39:54
【问题描述】:

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

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

但是,如果我有一个基于文档的应用程序,我需要让活动文档句柄 menuWillOpen?那么委托就不再是一个常量了。

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

【问题讨论】:

    标签: macos nsmenu


    【解决方案1】:

    我想出了这个似乎可以工作的代码:

    // 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:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      相关资源
      最近更新 更多