Swift:在Container View / NSView中切换NSViewController

时间:2016-11-24 15:41:47

标签: swift storyboard segue nsview nsviewcontroller

我想要实现一个非常简单的任务 - 通过按下按钮来更改容器视图的ViewController

enter image description here

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

我很困惑,因为如果我创建一个Outlet,容器视图本身似乎是NSView,据我所知,NSView不能包含VC。真的很感谢你的帮助!

2 个答案:

答案 0 :(得分:8)

请注意,要使其工作,您必须将故事板标识符添加到视图控制器,这可以转到故事板,然后在右侧窗格中选择Identity Inspector,然后输入Storyboard ID in Identity子类别。

然后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.addChildViewController(vc1)
        self.addChildViewController(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)
        }

    }
}

答案 1 :(得分:3)

也许这是一个迟到的答案,但无论如何我都会发布我的解决方案。希望它可以帮到某人。

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

  • 转到故事板中的NSTabViewController

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

  • 然后单击Tab Bar View Controller中的TabView,并将样式设置为“tabless” see image here

在此之后你需要:

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

通过在重写准备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 
    } 

一切顺利!