如何从应用程序委托访问 NSViewController?

How to access NSViewController from app delegate?

在我的 macOS 应用程序中,我有菜单项,它们也在主 UI 中复制。应用程序由主 window 及其委托和单个视图及其视图控制器组成。在 app delegate 中,我捕获了菜单项的单击操作,然后我需要将此事件发送到我的视图控制器,以便采取适当的操作并更新 main UI.

问题是如何从应用程序委托访问我的视图控制器 (NSViewController)?

如果你有 window 作为 IBOutlet 你可以做

var rootViewController: MyViewController? {
    return window!.contentViewController as? MyViewController
}

func sendPressed(_ sender: Any?) {
   rootViewController?.sendPressed()
}

如果没有window变量可以通过

获取
NSApplication.shared.orderedWindows.first!

实际上您不需要对控制器的引用。有First Responder

  • 声明 IBActions
  • 在 Interface Builder 中,将菜单项连接到目标对象的 First Responder(红色立方体)并选择适当的操作。

该动作将在实现该动作的响应链的第一个对象中执行。