gpt4 book ai didi

macos - Cocoa Storyboard 响应链

转载 作者:IT王子 更新时间:2023-10-29 05:50:15 25 4
gpt4 key购买 nike

Cocoa 应用程序的 Storyboard似乎是一个很好的解决方案,因为我更喜欢您在 iOS 中找到的方法。然而,虽然将事情分解成单独的 View Controller 在逻辑上很有意义,但我不清楚如何将窗口控制(工具栏按钮)或菜单交互向下传递给相关的 View Controller 。我的应用程序委托(delegate)是第一响应者,它接收菜单或工具栏操作,但是,我如何访问我需要将该消息发送到的 View Controller ?您可以深入查看 View Controller 层次结构吗?如果是这样,你如何从应用程序委托(delegate)那里到达那里,因为它是第一响应者?你可以让窗口 Controller 成为第一响应者吗?如果是这样,如何?在 Storyboard 中?在哪里?

因为这是一个高层次的问题,所以它可能并不重要,但是,如果您想知道的话,我在这个项目中使用的是 Swift。

最佳答案

我不确定是否有“适当”的方法来解决这个问题,但是,我想出了一个我现在将使用的解决方案。先说几个细节

  • 我的应用程序是一个基于文档的应用程序,因此每个窗口都有一个文档实例。

  • 应用程序使用的文档可以充当第一响应者并转发我已连接的任何操作

  • 该文档能够获取顶层窗口 Controller ,从那里我能够向下钻取 View Controller 层次结构以找到我需要的 View Controller 。

因此,在窗口 Controller 上的 windowDidLoad 中,我这样做:

override func windowDidLoad() {
super.windowDidLoad()

if self.contentViewController != nil {
var vc = self.contentViewController! as NSSplitViewController
var innerSplitView = vc.splitViewItems[0] as NSSplitViewItem
var innerSplitViewController = innerSplitView.viewController as NSSplitViewController
var layerCanvasSplitViewItem = innerSplitViewController.splitViewItems[1] as NSSplitViewItem
self.layerCanvasViewController = layerCanvasSplitViewItem.viewController as LayerCanvasViewController
}
}

这让我获得 View Controller (它控制您在下面用红色框出的 View )并在窗口 View Controller 中设置一个本地属性。

enter image description here

现在,我可以直接在响应链中的文档类中转发工具栏按钮或菜单项事件,从而接收我在菜单和工具栏项中设置的操作。像这样:

class LayerDocument: NSDocument {

@IBAction func addLayer(sender:AnyObject) {
var windowController = self.windowControllers[0] as MainWindowController
windowController.layerCanvasViewController.addLayer()
}

// ... etc.
}

由于 LayerCanvasViewController 在加载时被设置为主窗口 Controller 的属性,我可以访问它并调用我需要的方法。

关于macos - Cocoa Storyboard 响应链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com