我在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,地址= ...)。我不明白为什么这不能按预期工作?
答案 0 :(得分:0)
我怀疑崩溃的原因是没有对sourceViewController
的强烈引用(您在view2Button(_:)
中实例化)。您将其视图添加为子视图,将视图保留在内存中,但一旦操作方法返回,就没有对视图控制器的强引用,因此当从按钮发送操作消息时,没有视图控制器可以接收它
从这段代码的细节中退一步,我建议做一些研究 - 你想要实现的东西在OS X的Cocoa Programming中被称为“视图交换”;在iOS中它是“视图控制器包含”。如果有一个父视图控制器进行交换,它通常会更好。如果您有适用于OS X第5版的Cocoa编程,请查看第31章。但如果不这样做,您还可以查看sample code for that chapter。不过,我建议看看这本书(免责声明:我是它的合着者)。
答案 1 :(得分:0)