À 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é.
S'il vous plaît des conseils.
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 .
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é.