¿Deberían los controlleres uiview ser siempre parte de la jerarquía del control de visualización?

En la aplicación representada por la image a continuación, actualmente estoy usando tres UIViewControllers: un controller de vista maestra, uno para el menu principal y otro para una pantalla de configuration que se inicia en el menu principal. Como estoy aprendiendo más sobre cómo funciona UIViewController y para qué está diseñado, estoy cuestionando la sabiduría de mi architecture.

Me parece que el punto principal de la subclass es poder anular los methods que se llaman automáticamente durante el ciclo de vida del controller: viewDidAppear, viewWillAppear, willRotateToInterfaceOrientation, etc. Parece que estos methods solo se llaman si el UIViewController ( o subclass) es parte de la jerarquía UIViewController. Por lo tanto, no tiene sentido subclasificar UIViewController a less que vaya a usar uno de los medios estándar para crear una jerarquía de viewcontroller, es decir, UINavigationController, [UIViewController presentModalViewController], etc.

Soy cauteloso de usar los medios de estilo Cocoa de agregar controlleres de vista a la jerarquía porque todos parecen ser muy restrictivos. Por ejemplo, podría mostrar mi pantalla de configuration usando [UIViewController presentModalViewController], pero no quiero que oculte la pantalla completa. Hay animation en segundo plano con la que quiero que el usuario pueda interactuar incluso cuando la pantalla de configuration está visible.

Estas son mis preguntas:

1) ¿Es absurdo subclass UIViewController a less que vaya a agregarlo a la jerarquía viewController a través de una de las técnicas de Apple?

2) ¿Estoy en lo cierto en mi suposition de que los medios incorporados para mostrar nuevas vistas son demasiado restrictivos para mí, y para tener la flexibilidad que deseo, voy a necesitar simplemente cargar vistas a través de [ver addSubview]

3) Si es cierto que subclass UIViewController no tiene sentido para mi menu y las vistas de configuration, ¿cómo debo evitar tener todo mi código en una subclass UIViewController monstruo? ¿Debo simplemente subclasificar NSObject, agregar los IBOutlets e IBActions apropiados y pasar eso como el propietario del file cuando carga la punta usando [NSBundle loadNibNamed]?

introduzca la descripción de la imagen aquí

Buena pregunta. En primer lugar, un punto de claridad: lo que usted denomina "una de las técnicas de Apple" se menciona en la Guía de progtwigción de UIViewController como "presentación indirecta", e incluye cosas como presentación modal, ser presionado en una stack de navigation, presentar un controller popover , etc. Básicamente, todos estos methods de control de vista se consideran methods de presentación "indirectos", mientras que el uso de -addSubview: (algo así como [someView addSubview:myViewController.view] ) se considera una presentación "directa".

De dicha guía de progtwigción: (Cita del bloque gigante …)

Se recomienda que use solo las técnicas sugeridas para mostrar las vistas de sus controlleres de vista. Para presentar y gestionar vistas correctamente, el sistema toma nota de cada vista (y su controller de vista asociado) que visualiza directa o indirectamente. Utiliza esta información más adelante para informar los events relacionados con el controller de vista a su aplicación. Por ejemplo, cuando cambia la orientación del dispositivo, una window usa esta información para identificar el controller de vista más adelantado y notificarlo del cambio. Si incorpora una vista del controller de vista en su jerarquía por otros medios (agregándola como una subvista a otra vista quizás), el sistema supone que desea gestionar la vista usted mismo y no envía posts al object del controller de vista asociado . (el énfasis es mío)

Además de configurar la interfaz inicial de la aplicación, la mayoría de las otras vistas se presentan indirectamente a través de los objects del controller de vista.

Todo eso quiere decir que está en lo cierto al pensar que todos esos posts de UIViewController serán desperdiciados si simplemente agrega la vista a una jerarquía de vista directamente y no toma otra acción (la window de key es la exception). Esa cita también menciona que es más común usar la presentación indirecta.

1) Dudo en hacer una statement general y diga "Sí, en todos los casos, es absurdo subclass UIViewController a less que lo presente indirectamente". Estoy seguro de que hay un buen uso para él en algún lado. Me conformo con decir que personalmente nunca lo he hecho.

2) Absolutamente, no utilizaría una subclass UIViewController aquí.

3) Permítame dirigir su atención a otra área de la Guía de progtwigción:

En las aplicaciones de iPhone, las vistas en una jerarquía de vista cubren tradicionalmente toda la pantalla … Si desea dividir una jerarquía de vistas en múltiples subáreas y administrarlas por separado, use los objects de control genérico (objects personalizados que descienden de NSObject) en lugar de los controlleres de vista objects para administrar cada subárea. Luego, use un object controller de vista única para administrar los objects del controller genérico.

Eso está bastante claro con lo que quieres hacer aquí. Estás muerto con tu enfoque sugerido por ti mismo. Esa "Pantalla de configuration lanzada por el menu principal" debe ser administrada por un object de controller genérico que desciende de NSObject, que a su vez es administrado por su subclass UIViewController de pantalla completa.