Swift: ¿Cómo vincular dos controlleres de vista en una vista de contenedor y cambiar entre ellos usando un control segmentado?

En este momento tengo un controller de vista que contiene 1 control segmentado y 2 vistas de interfaz de usuario. Pero creo que es demasiado complicado actualizar la vista de la interfaz de usuario para mejorarla en futuras ediciones. Estoy usando un método oculto.

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. } } 

Lo que quiero es 1 vista de contenedor que contenga 2 vistas de controller para que pueda cambiarlas usando el control segmentado.

introduzca la descripción de la imagen aquí

Por favor aconséjame.

El otro enfoque es tener un controller de vista secundario en la memory al mismo time y, luego, al cambiar el valor seleccionado en el control segmentado, cargue el nuevo controller de vista secundaria, la transición entre un controller de vista secundaria al siguiente y luego eliminar el viejo controller de vista infantil:

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

Obviamente, esto supone que ya tiene el primer controller de vista secundario ya en la vista (fácil de hacer si utiliza el control "contenedor" en Interface Builder) y el valor seleccionado por defecto para las coincidencias UISegmentedControl . También debe tener identificadores de storyboard para estas dos escenas secundarias.

Para la versión Swift 2, ver la revisión previa de esta respuesta .

Intenté mucho hacer esto hace un time. Por alguna razón, las properties ocultas no funcionarían para mí, y la vista del contenedor no parece actualizarse. Sé que no es la solución ideal, pero terminé creando dos vistas de contenedor y usando el control segmentado para cambiar las alfas de las vistas de contenedor. Una vez más, no es ideal, pero funcionó muy bien.

importar UIKit

class ContactsView: UIViewController {

 @IBOutlet weak var segmentedControl: UISegmentedControl! @IBOutlet weak var privateView: UIView! @IBOutlet weak var publicView: UIView! @IBAction func segmentChanged(sender: UISegmentedControl) { switch segmentedControl.selectedSegmentIndex { case 0: privateView.hidden = false publicView.hidden = true case 1: privateView..hidden = true publicView.hidden = false default: break; } } override func viewDidLoad() { super.viewDidLoad() } 

}