导航到同一窗口内的不同视图控制器

时间:2016-03-17 04:02:29

标签: swift macos cocoa nsviewcontroller

我在Xcode 7.2.1中创建了一个OS X Cocoa应用程序。我在Main.storyboard上为默认视图控制器提供了故事板ID" view1"。我添加了另一个视图控制器,并为其提供了故事板ID" view2"。我在" view1"添加了一个按钮。并将该操作链接到ViewController.swift并添加以下代码:

@IBAction func view1Button(sender: AnyObject) {

    for v in view.subviews {
        v.removeFromSuperview()
    }

    let mainStoryboard: NSStoryboard = NSStoryboard(name: "Main", bundle: nil)
    let sourceViewController = mainStoryboard.instantiateControllerWithIdentifier("view2")
    self.view.addSubview(sourceViewController.view)
}

当我按下" view1"上的按钮时,一切都按预期工作。 "厂景"被驳回并且" view2"出现在同一个窗口中。

On" view2",我做了同样的事情。添加了一个按钮并将操作链接到ViewController2.swift并添加了以下代码:

@IBAction func view2Button(sender: AnyObject) {

    for v in view.subviews {
        v.removeFromSuperview()
    }

    let mainStoryboard: NSStoryboard = NSStoryboard(name: "Main", bundle: nil)
    let sourceViewController = mainStoryboard.instantiateControllerWithIdentifier("view1")
    self.view.addSubview(sourceViewController.view)
}

它没有按预期工作。当我点击" view2"上的按钮时应用程序崩溃,我收到以下错误:"线程1:EXC_BAD_ACCESS(代码= 1,地址= ...)。我不明白为什么这不能按预期工作?

2 个答案:

答案 0 :(得分:0)

我怀疑崩溃的原因是没有对sourceViewController的强烈引用(您在view2Button(_:)中实例化)。您将其视图添加为子视图,将视图保留在内存中,但一旦操作方法返回,就没有对视图控制器的强引用,因此当从按钮发送操作消息时,没有视图控制器可以接收它

从这段代码的细节中退一步,我建议做一些研究 - 你想要实现的东西在OS X的Cocoa Programming中被称为“视图交换”;在iOS中它是“视图控制器包含”。如果有一个父视图控制器进行交换,它通常会更好。如果您有适用于OS X第5版的Cocoa编程,请查看第31章。但如果不这样做,您还可以查看sample code for that chapter。不过,我建议看看这本书(免责声明:我是它的合着者)。

答案 1 :(得分:0)

只是为了澄清您使用的是Xib(或Nib)甚至是故事板吗?..

如果您使用的是故事板,那么事情的工作方式与单个控制器的工作方式略有不同......它们会按照预期的顺序单独加载,并且需要相应地进行处理。

因此,如果使用故事板(我认为你就像我在开始时一样,请告诉我们)。

这一切都有所不同,取决于你的控制器如何安排......

故事板看起来像这样(例如):

enter image description here

查看视图之间的链接等等。

其余的......出现像这样(xibs):

enter image description here