2016-08-11 41 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

相關問題