example bar ios objective-c ios6 segue

ios - example - uisearchbar swift 4



ContainerView con múltiples segmentos de inserción (6)

¿Hay alguna manera de tener un solo ContainerView con múltiples segmentos de inserción? El objetivo es que un ContainerView contenga varios ViewControllers diferentes, según los botones que se hayan presionado; Solo uno será visible a la vez. Quiero usar los segmentos de inserción para que en el Constructor de interfaces los guiones gráficos se muestren automáticamente en el mismo tamaño que el ContainerView.

Me doy cuenta de que puedo cambiar manualmente el tamaño de los otros ViewControllers en InterfaceBuilder, pero quiero el tamaño automático proporcionado por el segmento de incrustación. Si hay otra forma de hacerlo, también estaría bien. No tener las vistas cargadas en viewDidLoad está bien. Como se mencionó anteriormente, el ViewController mostrado puede cambiar según los botones que se presionen.



Lo he logrado haciendo uso de -shouldPerformSegueWithIdentifier:sender: Tengo un contenedor al que se le pasa un objeto y, según el tipo de este objeto, decide qué controlador de vista secundario mostrar.

La estructura parece un poco más complicada, pero permite que el controlador de vista base ignore los diferentes tipos de tareas que tengo, dejando eso al controlador de vista de contenedor. El controlador de vista de contenedor tiene, entonces, múltiples vistas de contenedor, las cuales solo se realizan según el tipo de tarea.

No sé si realmente puedes realizar los -performSegueWithIdentifier:sender: manualmente llamando a -performSegueWithIdentifier:sender: pero eso también podría ser una posibilidad.


Luché con esto durante mucho tiempo, también. Tenía el caso en el que tenía diferentes controladores de vista de tabla incrustados pero similares que quería mostrar, según un parámetro que se configuró en el segue del controlador de vista. Lo que funcionó fue colocar en el contenedor incrustado con un IBOutlet en el controlador de vista. El contenedor puede tener restricciones de tamaño establecidas en IB. Sin embargo, no hagas ninguna incrustación en el IB. Luego, en viewDidLoad, agrego programáticamente el controlador de vista correcto y pincho sus bordes al contenedor incrustado.

El corazón de este enfoque se ve en el siguiente código (Swift 4):

extension UIView { func pinToParent() { self.translatesAutoresizingMaskIntoConstraints = false let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left] NSLayoutConstraint.activate(attributes.map { NSLayoutConstraint(item: self, attribute: $0, relatedBy: .equal, toItem: self.superview, attribute: $0, multiplier: 1, constant: 0) }) } } class ColorVC: UIViewController { @IBOutlet weak var tableContainer: UIView! var color : rgb = .red fileprivate var colorTableVC : ColorTableVC? override func viewDidLoad() { super.viewDidLoad() switch color { case .red: colorTableVC = RedTableVC.init(style: .plain) case .green: colorTableVC = GreenTableVC.init(style: .plain) case .blue: colorTableVC = BlueTableVC.init(style: .plain) } if let vc = colorTableVC { if (vc.view) != nil { self.addChildViewController(vc) tableContainer.addSubview(vc.view) vc.view.pinToParent() vc.didMove(toParentViewController: self) } } } }

En el ColorVC, se ve el contenedor IBOutlet y el parámetro "color" establecido por el controlador de vista de tabla principal. RedTableVC, GreenTableVC y BlueTableVC están subclasificados en ColorTableVC, que está subclasificado en UITableViewController. La herencia común me permite usar una variable "colorTableVC" para apuntar a cualquiera de los controladores instanciados. (No del todo necesario). Pero esto evita duplicar el código a continuación para agregar la vista en la jerarquía y fijar el nuevo controlador a la vista del contenedor. En la parte superior, hice una extensión en UIView para fijar una vista a los bordes de sus padres.

La siguiente imagen muestra cómo se configuró en IB el proyecto y, en particular, el controlador de vista a la derecha. Para este ejemplo, hice la altura del controlador "integrado" a la mitad de la altura del controlador de la vista principal, por lo que cuando gira el dispositivo, se puede ver que las restricciones establecidas en IB se aplican efectivamente.


No, no hay forma de tener múltiples segmentos de incrustación en una vista de contenedor. Una forma de hacer toda la configuración en IB, sería hacer que el controlador integrado sea un UITabBarController (con la barra de pestañas oculta). Luego, puede tener tantos controladores en las pestañas como desee y cambiarlos en código usando la propiedad selectedIndex de UITabBarController.


Reconozco que esta pregunta es un poco antigua, pero quería responder en caso de que todavía esté buscando o que otras personas encuentren esto. Tuve un problema similar y trabajé alrededor de él.

En resumen, tendrás tres capas:
- un controlador de vista externo ("ExternalViewController")
- un administrador del controlador de vista ("ViewControllerManager")
- los controladores de vista secundarios con los que realmente desea cambiar ("ChildViewController")

Utilice una vista de contenedor en ExternalViewController con un segmento de incrustación al ViewControllerManager. El mismo ViewControllerManager mantendría programados a otros ChildViewControllers como se describe en esta documentación de Apple , específicamente la sección sobre cómo agregar y quitar un niño.

Cuando agrega un controlador de vista secundario, configure su marco para que sea el mismo que el marco de ViewControllerManager (ya que está haciendo esto dentro de ViewControllerManager, establezca el marco del niño igual a self.view.frame). También necesitará algo de lógica y un control externo para hacer el cambio dentro de ExternalViewController, por supuesto.

¡Espero que esto ayude!


Sí, pude lograr lo que buscabas inspirado en la publicación @rdelmar. Lo que debe hacer es incrustar un UITabBarViewController en su vista de contenedor. Luego, usted elige programáticamente qué controlador le gustaría presentar. Es posible que también desee ocultar la barra de pestañas.

Si lo desea, también puede ocultar las barras de pestañas que se ven en el archivo del guión gráfico.

Puede elegir el controlador de vista que desea presentar subclasificando el UITabBarController:

override func viewDidLoad() { super.viewDidLoad() self.selectedIndex = 1 }

Puede ocultar la barra de pestañas en el controlador de vista llamando a self.tabBarController?.tabBar.hidden = true en viewDidLoad ().