2016-08-11 45 views
0

我有一个任务来编写一个小应用程序,其中各种控制器必须嵌入到默认控制器中。所有控制器都存储在一个故事板中。嵌入控制器的子视图正确版本嵌入在子视图中的NSViewController


    if let id = getControllerId(pageIndex) { // get controller's storyboard id by segmented index 
     let storyBoard = NSStoryboard(name: "Main", bundle: nil) 
     let controller = storyBoard.instantiateControllerWithIdentifier(id) as! NSViewController 
     controller.view.translatesAutoresizingMaskIntoConstraints = false 
     if self.view.subviews.count > 0 { 
     let prevView = self.view.subviews[0] 
     prevView.removeFromSuperview() // here should be releasing previous controller 
     } 
     self.view.addSubview(controller.view) 
     // make all side constraints 
     let views = ["view": controller.view] 
     self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-(0)-[view]-(0)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)) 
     self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(0)-[view]-(0)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)) 
    } else { 
     NSLog("ERROR: Unable get controller storyboard id for index \(pageIndex)") 
    } 

而且我注意到,嵌入式控制器不执行viewWillDisappear

示例代码。我需要这个事件来清理观察者和其他一些东西。

我不确定这是正确的方式来显示控制器嵌入子视图,但我没有找到任何其他解决方案。

我做样本项目来测试这种情况

https://github.com/avvensis/embeddedviewcontrollers

有谁能帮我解决这个麻烦?

回答

1

viewWillDisappear不会执行,因为你不会隐藏任何东西。

您控制器在您创建后很快就会死亡。因此步骤#1是它持有的引用:

class ViewController: NSViewController { 

// MARK: - Custom properties 

let pageIds: [String] = ["redController", "yellowController", "greenController"] 

var currentControler : NSViewController! 

...

private func showEmbeddedController(pageIndex: Int) { 
if let id = getControllerId(pageIndex) { // get controller's storyboard id by segmented index 
    let storyBoard = NSStoryboard(name: "Main", bundle: nil) 
    currentControler = storyBoard.instantiateControllerWithIdentifier(id) as! NSViewController 
    currentControler.view.translatesAutoresizingMaskIntoConstraints = false 
    if self.view.subviews.count > 0 { 
    let prevView = self.view.subviews[0] 
    prevView.removeFromSuperview() // here should be releasing previous controller 
    } 
    self.view.addSubview(currentControler.view) 
    // make all side constraints 
    let views = ["view": currentControler.view] 
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-(0)-[view]-(0)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)) 
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(0)-[view]-(0)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)) 
} else { 
    NSLog("ERROR: Unable get controller storyboard id for index \(pageIndex)") 
} 
} 


} 

然后,只需已经在你的基地控制器DEINIT方法:

class EmbeddedViewController: NSViewController { 

....

deinit { 
    print("DEBUG: \(self.className) deinit") 
} 

} 
+0

Github项目已更新为其他用户。谢谢。 – avvensis

相关问题