2016-08-11 2 views
0

Je dois écrire une petite application dans laquelle différents contrôleurs doivent être intégrés dans le contrôleur par défaut. Tous les contrôleurs stockés dans un storyboard.Version correcte NSViewController intégré dans les sous-vues

Exemple de code des contrôleurs Enfouissement dans subviews


    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)") 
    } 

et je remarquai que le contrôleur embarqué n'exécute pas viewWillDisappear. J'ai besoin de cet événement pour nettoyer les observateurs et d'autres choses.

Je ne suis pas sûr qu'il soit correct de montrer les contrôleurs comme intégrés dans les sous-vues, mais je n'ai trouvé aucune autre solution.

Je fais exemple de projet pour tester cette situation

https://github.com/avvensis/embeddedviewcontrollers

Quelqu'un pourrait me aider avec ce trouble?

Répondre

1

viewWillDisappear ne s'exécute pas car vous ne cachez rien.

Votre contrôleur meurt rapidement après l'avoir créé. Donc, l'étape 1 est de tenir une référence à ce sujet:

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)") 
} 
} 


} 

méthode Puis tout simplement avoir deinit dans votre contrôleur de base:

class EmbeddedViewController: NSViewController { 

....

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

} 
+0

Le projet Github a été mis à jour pour les autres utilisateurs. Merci. – avvensis