目标是这样。程序有几种状态,左边是主窗口,右侧是一个控制盘。我的想法是对应不同的状态显示不同的控制盘,也就是说,有n个xib文件来展现这个控制盘。这是动态的。接下来就遇到一个问题。如果向一个视图里面添加另一个xib视图。从结果来,其实这件事情相当简单,也没有什么难度。我因为走了弯路遇到了很多问题。
界面上我没遇到什么困难,界面很容易就显示出来了。但是当我点击控制盘里面的按钮时候,弹出异常,程序崩溃了。
我的第一感是系统无法找到 我们的viewController,所以我查资料添加了
self.contentViewController?.addChildViewController(panelViewController!)
这样依然没有用。
func reInstallPanels(){
if panelState == nil {
panelViewController = GoNewController(nibName: "GoNewController", bundle: nil)
有错误时候的代码
// let panelViewController = GoNewController(nibName: "GoNewController", bundle: nil)
// self.contentViewController?.addChildViewController(panelViewController!)
panelFrameView.addSubview(panelViewController!.view)
panelViewController!.view.frame = panelFrameView.bounds
panelState = GoNewState.self
}
}
正确地做法其实就是:把let 去掉。然后增加一行定义。
class GoWindowController:NSWindowController, NSWindowDelegate {
var panelViewController : GoNewController?
就是这个,这个变量被释放掉了,所以产生了错误。我当时有一个错误的印象,认为view里面一定会保留 GoNewController 的引用。所以变量不会被释放。所以没有往这方向想。