我用Xcode 7.2.1创建了一个OS X Cocoa应用程序。我给Main.storyboard上的默认视图控制器一个"view1“的Storyboard ID。我添加了另一个视图控制器,并给它一个Storyboard 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“上的按钮时,一切都正常工作。"view1“被删除,而"view2”出现在同一个窗口中。
在"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“上的按钮时,应用程序崩溃并收到以下错误:”Thread1: EXC_BAD_ACCESS (code=1,address=...).我不明白为什么这不能像预期的那样工作?
发布于 2016-03-17 12:18:20
我怀疑崩溃的原因是没有对sourceViewController (在view2Button(_:)中实例化)的强引用。您将其视图作为子视图添加,这会将视图保留在内存中,但是一旦操作方法返回,就不会有对视图控制器的强引用,因此当操作消息从按钮发送时,没有视图控制器可以接收它。
从这段代码的细节出发,我建议做一些研究-在OS X的Cocoa编程中,你试图实现的是“视图交换”;在iOS中,它是“视图控制器包含”。通常情况下,如果有一个父视图控制器来进行交换,效果会更好。如果你手头上有OS X第五版的Cocoa编程,请看一下第31章。但是,如果您不这样做,您也可以查看sample code for that chapter。尽管如此,我还是建议看看这本书(免责声明:我是这本书的合著者)。
发布于 2016-03-17 12:18:46
只是为了澄清一下,你使用的是Xibs (或Nibs)还是故事板?
如果您使用的是故事板,则与单个控制器的工作方式略有不同。它们会根据自己的意愿(按照预期的顺序)单独加载,并需要相应地进行处理。
因此,如果使用故事板(我认为您在开始时也是如此,请让我们知道)。
这一切都是不同的,这取决于你的控制器是如何安排的…
序列图像板如下所示(例如):

请参阅链接等。在视图之间?
剩下的..。如下所示( xibs):

https://stackoverflow.com/questions/36051445
复制相似问题