Swift: 在容器视图/NSView 中的 NSViewController 之间切换

Swift: Switch between NSViewController inside Container View / NSView

我想完成一个非常简单的任务——通过按下按钮更改容器视图的 ViewController:

在我的示例中,ViewController1 使用 Interface Builder 嵌入到容器视图中。通过按下按钮 ViewController2 我想将视图更改为第二个 ViewController.

我很困惑,因为如果我创建一个 Outlet,Container View 本身似乎是一个 NSView,而据我所知,NSView 不能包含一个 VC。非常感谢您的帮助!

请注意,为了使其正常工作,您必须将故事板标识符添加到视图控制器,这可以通过转到您的故事板然后在右侧窗格中选择身份检查器然后输入 Storyboard IDIdentity 子类别中。

那么 ViewController 的这个实现将实现您正在寻找的东西。

import Cocoa

class ViewController: NSViewController {

    // link to the NSView Container
    @IBOutlet weak var container : NSView!

    var vc1 : ViewController1!
    var vc2 : ViewController2!

    var vc1Active : Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        // Make sure to set your storyboard identiefiers on ViewController1 and ViewController2
        vc1 = NSStoryboard(name: "name", bundle: nil).instantiateController(withIdentifier: "ViewController1") as! ViewController1
        vc2 = NSStoryboard(name: "name", bundle: nil).instantiateController(withIdentifier: "ViewController2") as! ViewController2

        self.addChild(vc1)
        self.addChild(vc2)
        vc1.view.frame = self.container.bounds
        self.container.addSubview(vc1.view)
        vc1Active = true

    }

    // You can link this action to both buttons
    @IBAction func switchViews(sender: NSButton) {

        for sView in self.container.subviews {
            sView.removeFromSuperview()
        }

        if vc1Active == true {

            vc1Active = false
            vc2.view.frame = self.container.bounds
            self.container.addSubview(vc2.view)

        } else {

            vc1Active = true
            vc1.view.frame = self.container.bounds
            self.container.addSubview(vc1.view)
        }

    }
}

也许这是一个迟到的答案,但无论如何我都会 post 我的解决方案。希望对大家有帮助。

我在 ContainerView 中嵌入了 NSTabViewController。然后,为了不在顶部看到标签,我这样做了:

  • 转到 Storyboard 中的 NSTabViewController

  • 在属性检查器中将样式更改为未指定

  • 然后点击Tab Bar View Controller中的TabView,设置样式为"tabless":

之后您需要:

  • 将 tabViewController 引用存储到 mainViewController 以便从代码select 选项卡
  • 向 mainViewController(您的容器所在的位置)添加一个按钮,您可以使用该按钮更改 tabViewController 中的选项卡。

您可以通过在覆盖 prepare for segue 函数时存储对 tabViewController 的引用来实现。这是我的代码:

首先将属性添加到mainViewController

private weak var tabViewController: NSTabViewController?

然后覆盖此函数并保留对 tabViewController 的引用:

    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
            guard let tabViewController = segue.destinationController
                as? NSTabViewController else { return }

            **self.tabViewController = tabViewController as? NSTabViewController**

        }

在此之后,您将参考所有设置的 tabViewController。 接下来(最后)你要做的是对按钮进行操作,以便移动到第一个(或第二个)视图控制器,如下所示:

@IBAction func changeToSecondTab(_ sender: Any) {
        self.tabViewController?.selectedTabViewItemIndex = 0 // or 1 for second VC 
    } 

祝一切顺利!