web-dev-qa-db-fra.com

Xcode - Comment puis-je intégrer/modifier par programmation un contrôleur de vue dans une vue conteneur?

J'essaie de définir par programme/ou modifier le View Controller incorporé à l'intérieur d'un View Controller .

J'ai 3 contrôleurs de vue différents, que je voudrais montrer dans la vue conteneur, tout dépend si l'utilisateur est connecté ou non.

J'ai regardé autour de moi et essayé plusieurs codes, j'ai trouvé celui qui fonctionnait, mais le code a modifié la vue autonome et non la vue des conteneurs d'affichage.

Une grande partie du code que j'ai essayé n'a pas non plus été dans Swift 3, alors en tant que nouveau développeur d'applications, cela a été assez stressant, car j'ai essayé de le convertir en Swift 3.

Quelqu'un peut-il fournir une solution pour changer le contrôleur de vue intégré dans un conteneur de vues? Merci.

6
JDoe

J'aurais peut-être trouvé une solution à cela. Je réponds ici, au cas où cela pourrait aider quelqu'un d'autre dans ma situation.

Ce que j’ai fait, c’est d’ajouter un nouveau Contrôleur de vue puis de l’intégrer au Conteneur de vue - Cela fonctionnera comme une "vue principale" - j’utilise ensuite ce contrôleur de vue vierge pour décider lequel autre contrôleur de vue doit être changé dans le self de la vierge.

Voici un code que j'ai dans le contrôleur de vue vide, mais je suppose que le contrôleur de vue vide peut également être utilisé comme contrôleur de vue principal (dans mon cas, pour "Compte"), puis il peut ajouter la vue de connexion/enregistrement en tant qu'enfant .

override func viewDidLoad() {
    super.viewDidLoad()

    updateView()
}

private lazy var loginViewController: loginViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as! loginViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

private lazy var registerViewController: registerViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "registerViewController") as! registerViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

private func updateView() {

    add(asChildViewController: registerViewController)

    /*
     if segmentedControl.selectedSegmentIndex == 0 {
     remove(asChildViewController: sessionsViewController)
     add(asChildViewController: summaryViewController)
     } else {
     remove(asChildViewController: summaryViewController)
     add(asChildViewController: sessionsViewController)
     }
     */
}

Crédit à ce type: https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

10
JDoe

Le moyen le plus simple de le faire est d’avoir 3 vues de conteneur dans Storyboard les unes au dessus des autres, chacune d’elles étant connectée à un contrôleur de vue différent. les besoins de l'entreprise.

Ceci est décrit en détail dans cet article de blog . J'espère que cela t'aides!

2
Mo Abdul-Hameed