2012-01-26 18 views
17

he estado rompiendo mi pelo a cabo en el último par de días tratando de entender éste aparentemente concepto básico de desarrollo de iOS:entendimiento Vista Controlador de anidación en IOS

  • Si yo quiero tener dos o más Ver Controladores visualizado y utilizables en la misma "pantalla completa", es la siguiente:

    1. No es aconsejable ya que por Apple "Uno VC por pantalla llena de contenido"
    2. totalmente posible mediante la adición de código a través de
    3. la VC
    4. Simplemente no hecho. En su lugar, use un VC y simplemente agregue un código que imita la funcionalidad de los controladores de visualización que desea.

Permítame rehacer un poco:

Si quería tener, en una aplicación para iPad, un UIView (A), que ocupa una gran parte del lado izquierdo de la pantalla, y un segundo UIView (B) que ocupa el resto del lado derecho de la pantalla, y yo quería agregar un botón al UIView B que al hacer clic utilizaría la transición modal para deslizar un UITableview para reemplazar UIView B, y este UITableview entonces actuaría como un típico UITableviewController por el cual cuando el usuario elige un elemento de la tabla, se envían los eventos típicos al controlador de vista de tabla para insertar un nuevo conjunto de elementos, ¿es esto posible?

Me parece que si ya soy capaz de crear fácilmente dos UIViewControllers separados, y tengo un botón en un VC modalmente, aparece el segundo VC, ¿por qué no puedo combinar esta funcionalidad para que un VC tenga dos hijos VCs? y esos niños VC manejan sus propias transiciones modales.

¿O es la mejor práctica en un caso como este simplemente tener un VC que maneja todo, y luego manejar manualmente animando las diapositivas dentro/fuera de varias vistas después de varios clics en varios elementos de la interfaz de usuario?

Como puede ver, creo que he leído demasiadas respuestas diferentes y contradictorias a preguntas similares a esta que me he confundido por completo acerca de qué es eso. Si alguien entiende lo que estoy aprendiendo y puede prestarme una explicación o algunos consejos, lo agradecería enormemente.

+0

¿Ha encontrado una buena manera de hacer esto en iOS 5? El problema que me gustaría resolver está bien definido en su referencia http://www.tumblr.com/tagged/child-view-controller. Seguramente sería bueno anidar las diversas piezas dentro de una vista maestra para evitar que la vista maestra se convierta en un código pesado. – mm2001

Respuesta

2

La Guía de programación del controlador View lo cubre bastante bien.

Un controlador de vista administra un conjunto de vistas. Puede tener controles de vista de contenido y controladores de vista de contenedor/navegación que administran la jerarquía de controladores de vista (ejemplo: el controlador de vista de navegación puede administrar un controlador de vista de lista y un controlador de detalle).

Está cubierto con más detalle aquí:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457

Un controlador de vista gestiona una porción discreta de interfaz usuario de la aplicación. A petición, proporciona una vista que se puede mostrar o interactuar con. A menudo, esta vista es la vista raíz de una jerarquía compleja de vistas - botones, conmutadores y otros elementos de interfaz de usuario con implementaciones existentes en iOS.El controlador de vista actúa como el agente coordinador central para esta jerarquía de vista , que maneja los intercambios entre las vistas y cualquier controlador relevante o objetos de datos.

Los controladores de vistas múltiples coordinan sus esfuerzos para presentar una única interfaz de usuario unificada .

+0

El enlace está muerto. – hnh

11

La respuesta depende de si necesita admitir iOS 4 o no. Si es así, la respuesta es:

respuesta número 1 - Con la excepción de los controladores de contenedores propios de Apple, en particular UITabBarController, UINavigationController, UISplitViewController, UIPageViewController y UIPopoverController (? ¿Me he perdido ninguna) camino no es soportado adecuadamente tener múltiples ver los controladores activos en la misma pantalla, administrando diferentes porciones de la vista. Los métodos de control de vista como presentModalViewController, etc. todos funcionan bajo la suposición de que hay un único controlador de vista "frontal" que posee toda la pantalla, y si intenta que varios controladores de vista administren diferentes partes de la vista, todo tipo de cosas se verán break, como el reenvío de eventos de rotación de pantalla y el cambio de tamaño/posicionamiento de vistas después de una transición de página.

Sin embargo, si sólo es necesario para apoyar iOS 5, la respuesta es:

respuesta número 2 - No hay problema! Solo asegúrese de que todos los controladores de vista de página secundaria estén conectados correctamente a un controlador de vista maestro que administre toda la página. Esto significa que, además de las vistas de los controladores que son subvistas de una vista principal común, los controladores mismos deberían ser controladores secundarios de un controlador padre común. Siempre que las propiedades parentViewController del controlador estén todas configuradas correctamente, debería poder administrar este tipo de interfaz compuesta sin demasiada molestia.

Desafortunadamente, Apple solo agregó setters públicos para childViewControllers y parentViewControllers en iOS5. En iOS4 y versiones anteriores, usted está limitado a los arreglos de controladores de contenedor propios de Apple y no puede crear los suyos propios (al menos, no sin problemas de reenvío de eventos).

Suponiendo que necesita soportar iOS4 por ahora, la respuesta número 3 parece ser su mejor opción: construya su interfaz usando múltiples vistas pero un solo controlador. Esto no es tan malo sin embargo. Puede crear subclases de vista personalizadas que administren sus propias subvistas (por ejemplo, no hay ninguna regla que diga tableViewDataSource o delegate tiene que ser una subclase UIViewController, o que un botón IBAction tiene que ser un método en un controlador de vista en lugar de otra vista).

En realidad, descubrirá que la mayoría de las funciones que normalmente incorpora a un controlador de vista pueden integrarse en una vista de contenedor "inteligente", lo que le permite dividirla en varias "vistas de controlador" autónomas que gestionan su contenidos propios

Lo único difícil es hacer cosas como transiciones entre una vista y la siguiente. Para esto no podrá usar los métodos estándar presentModalViewController o pushViewController, tendrá que hacer las animaciones usted mismo usando CATransitions o animaciones UIView.

+0

Sí, vi el video de la WWDC sobre cómo los controladores de vista pueden tener padres e hijos, sin embargo, como en la mayoría de los videos de la WWDC, tienden a pasar por alto algunos detalles aquí y allá. Esto es útil sin embargo. ¿Es posible hacer esto a través de IB? A pesar de lo difícil que intento no puedo entender cómo tener dos VCs en la misma pantalla vía IB, siempre crea una nueva pantalla para cada VC que arrastro. –

+1

Encontré este sitio web con una mejor explicación sobre el tema: http://www.tumblr.com/tagged/child-view-controller, aunque explica que debe agregar los childViewControllers programáticamente y también colocarlos programáticamente. Esperaba que hubiera un enfoque para agregar y posicionar estos controladores a través de IB, si alguien sabe. –

+1

No creo que puedas hacerlo en IB. Lo que puede hacer es establecer el tamaño de la vista raíz de su controlador de vista en IB configurando la barra de estado en "ninguno", lo que deshabilitará los controles de ancho/alto en el inspector. Luego puede diseñar el diseño para cada subvista en IB, como plumillas separadas y luego pegar los controladores de visualización en código, lo que no debería ser tan malo si solo tiene uno o dos en la pantalla. –

3

Esto es definitivamente posible en IOS 4:

se tiene una vista controlador "A" con su punto de vista:

  • Alloc init el controlador de vista "B" que desea tenido en su controlador de vista "A"
  • Llamar (vacío) addSubview: (UIView *) ver en la vista del controlador de vista "A" con la vista del controlador de vista "B" como parámetro
  • El marco de la vista de la vista el controlador "B" está configurado en pantalla completa debido a addSubView, así que cámbialo para poner la vista donde desee en la vista del controlador de vista "A".
  • Agregue algunas animaciones UIView cuando cambie el marco para tener una buena visualización.

En iOS5 sólo tiene que utilizar el método en el controlador de vista "A":

  • (void) addChildViewController: (UIViewController *) childController
Cuestiones relacionadas