2016-08-11 10 views
0

私は、さまざまなコントローラをデフォルトのコントローラに組み込む必要がある小さなアプリケーションを作成するタスクを持っています。すべてのコントローラは1つのストーリーボードに格納されます。サブビューに埋め込まれた正しいリリースの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

関連する問題