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

Swift 如何从应用程序委派访问NSViewController?,swift,macos,appdelegate,nsviewcontroller,Swift,Macos,Appdelegate,Nsviewcontroller,在macOS应用程序中,我有菜单项,这些菜单项也在主UI中复制。应用程序由主窗口及其委托和单个视图及其视图控制器组成。在应用程序中,我捕获菜单项“单击操作”,然后我需要将此事件发送到我的视图控制器,以便采取适当的操作并更新主UI 问题是如何从app delegate访问我的视图控制器(NSViewController)?如果您有window作为IBOutlet您可以做什么 var rootViewController: MyViewController? { return window!

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


问题是如何从app delegate访问我的视图控制器(
NSViewController
)?

如果您有
window
作为
IBOutlet
您可以做什么

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

func sendPressed(_ sender: Any?) {
   rootViewController?.sendPressed()
}
如果没有
窗口
变量,可以通过

NSApplication.shared.orderedWindows.first!

实际上,您不需要控制器的引用。有
第一响应者

  • 声明
    iActions
  • 在Interface Builder中,将菜单项连接到目标对象的第一个响应程序(红色立方体),并选择适当的操作

该操作将在执行该操作的响应者链的第一个对象中执行。

我将菜单处理放在app delegate中的原因是我需要更改
NSMenuItem
的状态,并为一组项目设置互斥复选框,因此我为每个菜单项设置了参考出口。现在,如果我为ViewControllers中的菜单项声明
iAction
,我应该告诉app delegate使用参考插座更改菜单项的状态,或者以某种方式获取ViewControllers中的菜单项,对吗?至于响应器链,我有一个问题。通过将
iAction
连接到菜单项action,框架是否仍然遍历响应程序链?我认为,
iAction
是指向确切的实例和方法作为目标/动作,它是从故事板创建的。所以链接在构建之后就在那里了。据我所知,非目标操作正在响应器链中穿行。也许值得提出一个新问题,但由于您在回答中提到了响应者链,我希望看到您对此的反馈。“在应用程序中,我捕获菜单项“单击操作”,然后我需要将此事件发送到我的视图控制器,以便采取适当的操作并更新主UI。”这听起来不是一个好的游戏计划。现在我在控制器中捕获菜单项动作,然后通过应用程序代理更新菜单项。听起来更好吗?不。当您在AppDelegate中创建指向视图控制器的指针时,AppDelegate仅在应用程序启动时具有该视图控制器的信息。您最好的选择是通过Interface Builder设置第一响应者。我就是这样做的-将菜单项action连接到IB中的控制器。