en iOS6 noté la nueva Vista de contenedor, pero no estoy muy seguro de cómo acceder a su controlador desde la vista de contenedor.
Guión:
Quiero acceder a las etiquetas en el controlador de vista de alerta desde el controlador de vista que aloja la vista de contenedor.
Hay una separación entre ellos, ¿puedo usar eso?
ios
objective-c
swift
uiviewcontroller
uicontainerview
Adam Waite
fuente
fuente
Respuestas:
Sí, puede usar el segue para obtener acceso al controlador de vista secundario (y su vista y subvistas). Dele al segue un identificador (como
alertview_embed
), utilizando el inspector de atributos en Storyboard. Luego haga que el controlador de vista principal (el que aloja la vista de contenedor) implemente un método como este:fuente
Puede hacerlo simplemente con
self.childViewControllers.lastObject
(suponiendo que solo tenga un hijo, de lo contrario useobjectAtIndex:
).fuente
childViewControllers
"demasiado pronto"para programación rápida
puedes escribir asi
fuente
El
prepareForSegue
enfoque funciona, pero se basa en la cadena mágica del identificador de segue. Tal vez hay una mejor manera.Si conoce la clase de VC que busca, puede hacerlo de manera muy clara con una propiedad calculada:
Esto se basa en
childViewControllers
. Si bien estoy de acuerdo en que podría ser frágil confiar en el primero, nombrar la clase que busca hace que esto parezca bastante sólido.fuente
return childViewControllers.filter { $0 is CamperVanViewController }.first
en una sola líneachildViewControllers.flatMap({ $0 as? CamperVanViewController }).first
lo que creo que es un poco mejor, ya que arroja y elimina cualquier nulo.first(where:)
.childViewControllers.first(where: { $0 is CamperVanViewController })
Una respuesta actualizada para Swift 3, usando una propiedad calculada:
Esto solo itera la lista de hijos hasta que alcanza la primera coincidencia.
fuente
self.childViewControllers
es más relevante cuando necesita control del padre. Por ejemplo, si el controlador secundario es una vista de tabla y desea volver a cargarlo con fuerza o cambiar una propiedad mediante un toque de botón o cualquier otro evento en el Controlador de vista principal, puede hacerlo accediendo a la instancia de ChildViewController y no a través de prepareForSegue. Ambos tienen sus aplicaciones de diferentes maneras.fuente
Hay otra forma de usar la declaración de cambio de Swift en el tipo de controlador de vista:
fuente
Yo uso el código como:
fuente
En caso de que alguien esté buscando Swift 3.0 ,
viewController1 , viewController2 y así sucesivamente serán accesibles.
fuente
Con genérico puedes hacer algunas cosas dulces. Aquí hay una extensión de Array:
Luego puede hacer esto en su viewController:
fuente
puedes escribir asi
fuente