【问题标题】:How to access NSViewController from app delegate?如何从应用委托访问 NSViewController?
【发布时间】:2019-02-13 12:49:49
【问题描述】:

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

问题是如何从应用代理访问我的视图控制器 (NSViewController)?

【问题讨论】:

  • “在应用程序委托中,我捕获菜单项单击操作,然后我需要将此事件发送到我的视图控制器以便采取适当的操作并更新主 UI。”这听起来不像是一个好的游戏计划。
  • 现在我在控制器中捕获菜单项操作,然后通过应用程序委托更新菜单项。听起来更好吗?
  • 没有。当您在 AppDelegate 中创建指向视图控制器的指针时,AppDelegate 将仅在应用程序启动时具有该视图控制器的信息。您最好的选择是通过 Interface Builder 设置 First Responders。
  • 我就是这样做的 - 将菜单项操作连接到 IB 中的视图控制器。

标签: swift macos appdelegate nsviewcontroller


【解决方案1】:

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

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

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

如果你没有 window 变量,你可以通过它

NSApplication.shared.orderedWindows.first!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我将菜单处理放在app delegate中的原因是我需要更改NSMenuItem的状态并且有一组项目的互斥复选框,所以我对每个菜单项都有参考出口.现在,如果我为 ViewControllers 中的菜单项声明 IBAction,我应该告诉 app delegate 更改菜单项的状态,使用引用插座或者以某种方式获取 View Controller 中的菜单项,对吧?
    • 至于响应链我有一个问题。通过将IBAction 连接到菜单项操作,框架是否仍然遍历响应者链?我认为IBAction 指向确切的实例和方法作为目标/动作,它是从情节提要创建的。所以链接在构建后就在那里。据我所知,无针对性的行动正在通过响应者链。可能值得提出新问题,但是由于您在回答中提到了响应者链,因此我希望看到您对此的反馈。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多