web-dev-qa-db-fra.com

Swift - Comment lier deux contrôleurs de vue dans une vue conteneur et basculer entre eux à l'aide d'un contrôle segmenté?

À l'heure actuelle, j'ai un contrôleur de vue contenant 1 contrôle segmenté et 2 vues d'interface utilisateur. Mais je pense que c'est trop compliqué de mettre à jour la vue d'interface utilisateur pour pouvoir l'améliorer en vue d'une édition ultérieure. J'utilise une méthode cachée.

import UIKit

class PopularHistoryViewController: UIViewController {


    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var popularView: UIView!
    @IBOutlet weak var historyView: UIView!

    @IBAction func indexChanged(sender: UISegmentedControl) {
        switch segmentedControl.selectedSegmentIndex
        {
        case 0:
            NSLog("Popular selected")
            //show popular view
            popularView.hidden = false
            historyView.hidden = true
        case 1:
            NSLog("History selected")
            //show history view
            popularView.hidden = true
            historyView.hidden = false
        default:
            break; 
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

}

Ce que je veux, c'est une vue conteneur qui contient 2 vues de contrôleur afin que je puisse les commuter à l'aide d'un contrôle segmenté.

enter image description here

S'il vous plaît des conseils.

13
Mohammad Nurdin

L’autre approche consiste à n’avoir qu’un seul contrôleur de vue enfant en mémoire à la fois, puis lors du changement de la valeur sélectionnée dans le contrôle segmenté, de charger le nouveau contrôleur de vue enfant, de faire la transition entre les contrôleurs de vue enfants, puis de supprimer le contrôleur. ancien contrôleur de vue enfant:

let viewControllerIdentifiers = ["first", "second"]  // storyboard identifiers for the child view controllers

@IBAction func didChangeValue(sender: UISegmentedControl) {
    let newController = storyboard!.instantiateViewController(withIdentifier: viewControllerIdentifiers[sender.selectedSegmentIndex])
    let oldController = childViewControllers.last!

    oldController.willMove(toParentViewController: nil)
    addChildViewController(newController)
    newController.view.frame = oldController.view.frame

    transition(from: oldController, to: newController, duration: 0.25, options: .transitionCrossDissolve, animations: {
        // nothing needed here
    }, completion: { _ -> Void in
        oldController.removeFromParentViewController()
        newController.didMove(toParentViewController: self)
    })
}

Cela suppose évidemment que vous ayez déjà le premier contrôleur de vue enfant déjà présent sur la vue (facilement si vous utilisez le contrôle "Vue du conteneur" dans Interface Builder) et la valeur sélectionnée par défaut pour les correspondances UISegmentedControl. Vous devez également avoir des identificateurs de storyboard pour ces deux scènes enfants.

Pour le rendu de Swift 2, voir révision précédente de cette réponse .

28
Rob

J'ai beaucoup essayé de le faire il y a un moment. Pour une raison quelconque, les propriétés masquées ne fonctionneraient pas pour moi et la vue des conteneurs ne semble pas se mettre à jour. Je sais que ce n'est pas la solution idéale, mais j'ai finalement créé deux vues de conteneur et utilisé le contrôle segmenté pour modifier les alphas des vues de conteneur. Encore une fois, pas idéal, mais cela a bien fonctionné.

1
scott