¿Es aconsejable agregar una vista de UIViewController a otra vista de UIViewController?

¿Es aconsejable agregar una view de UIViewController a la view de otro UIViewController ?

Por favor explique por qué es una buena práctica o una mala práctica.

Apple y, por lo tanto, la mayoría de las personas que siguen las pautas de Apple le dirán que son malas prácticas y que Apple agregó la contención de ViewController (childViewControllers) por ese motivo. Desafortunadamente, la mayoría de las personas lo siguen ciegamente y no le dirán por qué son malas prácticas. Y me alegra que preguntes eso.

La verdad es que, en una architecture model-vista-controller, las vistas deberían ser reutilizables independientemente del contenido que contengan, por lo tanto, la vista y el object que controla el contenido de la vista no deberían ser iguales. Lo que es exactamente lo que hace un UIViewController antes de iOS5 Apple lo desalentó a usarlos en múltiples mientras que es algo muy lógico. Por supuesto, esto era confuso, muchas personas ignoraron las directrices y lo hicieron de todos modos, incluido yo mismo, las aplicaciones funcionaron bien y pasaron la validation de la tienda de aplicaciones que causó aún más confusión. El resultado es que hasta el día de hoy la gente todavía hace preguntas sobre esto incluso más de un año después de que Apple se derrumbara y nos dio ViewControllers contenedor personalizado. He visto personas responder a esta pregunta a menudo con respuestas complejas en cuanto a la recreación de UIViewController como una class que henetworkinga de NSObject para problemas muy simples. El hecho de que Apple desalienta el uso de UIViewControllers y sin saber por qué.

Dado que agregar una vista de ViewController como una subvista a menudo funcionará perfectamente y la contención de ViewController no está disponible en iOS4, lo cual muchos aún admiten, demasiadas personas no se molestan en usar la contención de ViewController. Es la solución más limpia y cuando tiene ganas de usar ViewControllers en ViewControllers, debe usarlo cuando sea posible. De lo contrario, en la mayoría de las situaciones, usted debería poder simplemente agregar una vista de ViewController como una subvista, solo debe saber en qué situaciones.

Esto es lo que puede esperar si simplemente agrega una vista de ViewController a otra vista:

  • No se garantiza que los methods de retorno de llamada reciban llamada. Métodos como viewWillAppear, viewDidAppear, viewWillDisappear y viewDidDisappear pueden o no recibir llamadas. Dependirá en gran medida de la versión del sistema operativo, en iOS4 nunca se llamará, en iOS5 y superiores se llamarán principalmente. Por lo tanto, no puede anular estos methods porque no puede confiar en ellos, no tiene control sobre cuándo, cuándo o cuántas veces recibirán llamadas.
  • El único método de callback de vista que siempre se llamará correctamente es viewDidLoad.
  • Las devoluciones de llamada de rotation no se recibirán. Dependiendo de su situación, esto puede ser un gran problema o no importa en absoluto. Si la máscara de autoría de la vista es suficiente para volver a colocarla y reescala, entonces estás bien. Si no es así, siempre puede hacer una implementación personalizada cuando se llamen llamadas de rotation de ViewController de la supervisión.
  • Debe mantener una reference al ViewController usted mismo, de lo contrario se liberará inmediatamente mientras su vista se mantendrá retenida por su supervisión.

Definitivamente no lo alentaría, pero tampoco lo desanimo. Es una situación y si no tiene que soportar iOS4, entonces, en su mayoría, puede evitarlo. Pero si mantiene la list anterior en mente, tampoco causará ningún daño y su aplicación funcionará bien.

A veces está bien y, a veces, no es así. Es difícil dar una mejor respuesta que eso sin mostrar algunos diagtwigs y explicar la relación entre la jerarquía del controller de vista y la jerarquía de vista.

Afortunadamente, Apple ya lo ha hecho. Vea el video "Implementación de Contabilidad de UIViewController" en WWDC 2011 para get una explicación detallada de cuándo está bien y cuándo no.

Esta es en realidad una situación común con jerarquías de vista complejas. Desde iOS 5, UIViewController permite agregar un controller de vista secundaria. Cuando está agregando el controller secundario, también está agregando la vista del niño en la vista del controller.

Por otro lado, nunca debe agregar una vista del controller de vista a otro controller de vista sin agregarlo como el controller de vista secundaria.

Sin embargo, no lo abuse. Deberías hacerlo cuando

  • está implementando un contenedor para un set de controlleres (algo así como su propio UINavigationController o UISplitViewController )
  • el controller secundario es independiente. Si los controlleres secundarios invocan constantemente los methods en su elemento primario y viceversa, sería una mejor idea implementar la funcionalidad en un solo controller.

Puede salirse con la suya, pero probablemente haya una mejor manera. Parece razonable pensar que ambos intentarán manipular la vista. Mi respuesta es no.

¿Qué está tratando de lograr?

Por supuesto, puede agregar la vista de UIViewController a la vista de otro UiViewController al less como una variable de class. Pero no puedo entender el objective final de esta solución. Creo que es una mala práctica porque la complejidad de la interfaz de la aplicación está aumentando.

Por lo general, en la architecture Model-View-Controller, podemos reutilizar vistas.

Pero para UIViewController, puede que no siempre sea una buena idea. Puede hacer que la architecture del proyecto sea compleja porque, según las vistas de documentation de Apple, está estrechamente vinculado al controller de vista, por lo que puede no ser fácilmente manejable.

Desde la reference UIViewController: los controlleres de vista están estrechamente vinculados a las vistas que administran y toman parte en la cadena de respuesta utilizada para manejar los events. Los controlleres de vista son descendientes de la class UESpondersponder y se insertan en la cadena de respuesta entre la vista de raíz administrada y su supervisión, que normalmente pertenece a un controller de vista diferente. Si la vista del controller de vista no maneja un evento, el controller de vista tiene la opción de manejar el evento o puede pasar el evento a la vista de supervisión.

Pero, creo que podemos reutilizar una vista si hay una diferencia menor en la interfaz de usuario para los dos controlleres diferentes.