Xcode OS X Storyboards:如何获得对***“窗口内容”视图控制器的引用?
Posted
技术标签:
【中文标题】Xcode OS X Storyboards:如何获得对***“窗口内容”视图控制器的引用?【英文标题】:Xcode OS X Storyboards: How do I get a reference to the top level "window content" view controller? 【发布时间】:2014-11-18 08:36:10 【问题描述】:我有一个基本的 Cocoa 应用程序来试用 Swift 和 Storyboard。
该应用由 3 个由 NSTabViewController
管理的主视图组成,这又与主窗口的“窗口内容”关系相关联。
我在窗口的工具栏中添加了NSSegmentedControl
以在 3 个选项卡视图之间切换。
在主窗口控制器中,我为工具栏项添加了在选项卡之间切换的操作方法,但我不知道如何获取对选项卡视图控制器的引用以实际切换选项卡。
我尝试将我的操作方法添加到选项卡视图控制器,但这不起作用,因为如果选项卡视图控制器包含空视图,它可能不在响应者链中(这是一个错误吗?)。
作为一种解决方法,我在选项卡视图控制器中覆盖了 viewDidAppear()。在那里,我得到了 view.window.windowController 的句柄,并在实例变量中设置了对“self”的引用。这有效,但似乎不正确。应该有一种方法可以从窗口控制器到它的内容视图控制器......
窗口控制器和选项卡视图控制器存在于不同的场景中,我无法通过 IBOutlet 连接它们。此外,对于“窗口内容”关系,也没有在窗口控制器上调用任何 segue 方法。
【问题讨论】:
嘿,马克。我遇到了恰好同样的问题。你还记得你最终做了什么来实现这一目标吗?这是我的问题的概述:gitlab.com/AMomchilov/public/experiments/… 我想我最终遍历contentViewController?.children
寻找我的标签视图控制器。与这种特殊情况无关,但非常有用的是NSResponder.supplementalTarget(forAction:sender:)
。我一直使用它来在我的窗口控制器中公开不直接属于响应者链的对象,以将操作转发到菜单和工具栏。
【参考方案1】:
我知道我来得太晚了,也许发布这个问题时它并不存在,但对于登陆这里的任何人,NSWindowController
有一个 contentViewController: NSViewController?
属性(在 macOS 10.10 中添加,所以在最后我认为是 2014 年)。
【讨论】:
【参考方案2】:我主要是 OS X 人,我自己也是 StoryBoards 的新手,但我认为你需要做的是:
写下你的
-(IBAction)someResponse:(id)sender
视图控制器中计划处理该操作的方法。
-
连接控件,以便将其操作发送到其 FirstResponder。如果您的视图控制器在响应者链中,它将接收它。
【讨论】:
感谢您的回答。我的问题是,如果操作由工具栏项触发,则实现该操作的选项卡视图控制器不在响应者链中。此外,我无法弄清楚如何跨视图控制器场景连接插座(简单的主/详细视图)。现在,我回到了普通的旧 nib 文件。 这是一个杂项,但我在我的 WindowController 中实现了 IBAction 并将其传递下去。我对 SplitViews 也有类似的情况。如果您将 IBAction 放在 ViewController 中,则只有在 ViewController 处于焦点时才会调用它。 据我所知,您不会在故事板中跨场景连接插座。拥有子控制器的控制器通过“prepareForSegue”传递它需要传递的任何数据,然后您通过通知或委托等其他机制将数据传递回。 (我是故事板的新手;我只涉足 ios,Hillegas 不相信它们,所以我现在才尝试它们)以上是关于Xcode OS X Storyboards:如何获得对***“窗口内容”视图控制器的引用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Xcode Storyboards 创建 Popovers
如何根据目标C中StoryBoards中的特定条件转到新视图