2009-11-06 12 views
53

siempre especie de que se han preguntado cuándo utilizar un UIView frente a un UIViewController en el iPhone.Cuándo usar un UIView frente a un UIViewController en el iPhone?

Entiendo que no debe usar un UIViewController a menos que sea una vista de pantalla completa, pero ¿qué otras pautas hay?

Por ejemplo, quiero construir una superposición modal, una pantalla que se deslizará en su lugar sobre la pantalla actual. Si esta superposición modal es a pantalla completa, ¿debería ser un UIViewController? La última vez que construí algo así, clasifiqué UIViewController, pero ahora me pregunto si fue correcto.

Respuesta

38

partir de Apple View Controller Programming Guide for iOS:

"El papel más importante de un controlador de vista es la gestión de una jerarquía de puntos de vista Cada controlador de vista tiene una visión única raíz que encierra todo el contenido de la vista controlador Para que la vista raíz.. , agrega las vistas que necesita para mostrar su contenido ".

también:

"Hay dos tipos de controladores de vista:.

  • controladores de vista contenido de la gestión una pieza discreta de contenido de la aplicación y son el principal tipo de controlador de vista que se crea
  • controladores de vista de contenedores recogen información de otros controladores de vista (conocidos como controladores de vista niño) y lo presentan de una manera que facilita la navegación o presenta el contenido de dichos controladores de vista diferente.

mayoría de las aplicaciones son una mezcla de ambos tipos de controladores de vista ".

+1

Simplemente actualizando el enlace a la guía de Apple: http://goo.gl/KF2wg –

+1

Esta respuesta debe cambiarse ya que está muy desactualizada y es engañosa MUCHAS personas, incluyéndome a mí. Esta respuesta casi me hizo cambiar un montón de cosas en mi aplicación, hasta que descubrí que nada de esto se aplica si está trabajando en iOS5 o posterior. Los VC ya no se consideran "la pantalla con UIViews dentro de él". Los VC ahora pueden contener otros VC en ContainerViews y se denominan VC hijos o VC contenedores. Añadir un VC hijo a un VC principal NO estropeará la rotación. Todavía rotará desde la perspectiva del VC principal. – lespommes

0

es lo que se desliza en una pantalla independiente? Quiero decir, ¿interactúa directamente con el padre? Si es así, que sea un UIView, si no, probablemente le recomendará un UIViewController.

+0

En este caso, la superposición es parte de una aplicación Lite. Cuando el usuario intenta hacer una actividad restringida, la superposición modal aparece y los avisa. Se usará en varios controles de vista, pero emitirá mensajes diferentes según la acción que el usuario haya intentado realizar. La superposición básicamente tiene un mensaje y una pequeña UIWebView para mostrar un anuncio que se puede hacer clic y que los lleva a la versión completa en la tienda de aplicaciones. –

+0

Interesante. Creo que esto podría ir de cualquier manera, pero probablemente lo haría como un UIView. Creo que UIView es más fácil de reutilizar en otros UIViewControllers. Pero ciertamente es opinión. – marcc

+0

Lo hice en mi aplicación: el usuario alcanzó el nivel 3 y puse una vista que decía "Has llegado al último nivel. Haz clic aquí para ir a la tienda de aplicaciones y comprar la versión completa". Fue rechazado por Apple. – mahboudz

11

Esta es una gran pregunta.

Mi regla básica. Es que cada 'página' principal de una aplicación obtiene su propio controlador de vista. Lo que quiero decir con eso es que durante la fase de encuadre del diseño de la aplicación, todo lo que existe como su propia entidad será eventualmente administrado por su propio Controlador de Vista. Si hay una pantalla modal que se desliza sobre una pantalla existente, la consideraré como una 'página' separada y le daré su propio controlador de vista. Si hay una opinión de que las superposiciones y página existente (por ejemplo, una pantalla de carga o de ayuda emergente.) Me gustaría tratar a las personas de manera diferente, pusieran en práctica con subclases UIView y mantener la lógica en la que el controlador '' páginas vistas. Si la ventana emergente tiene un comportamiento, le devolveré la comunicación a esas páginas. Ver el controlador utilizando el patrón de delegado.

Espero que esto ayude. Es una cuestión filosófica y arquitectónica y se podría escribir mucho al respecto.

4

Uso UIViewController cada vez que una vista es a pantalla completa y tiene salidas/acciones y/o subvistas.

0

Una UIView es parte del UIViewController, vea la propiedad de visualización de UIViewController para esto. Como señaló correctamente, UIViewController administra una pantalla completa y solo debería haber un UIViewController visible a la vez. Pero en la mayoría de los casos tendrá más UIViews o subclases de UIView visibles en la pantalla.

El ejemplo que proporcionó sería un uso correcto en la mayoría de los casos. Como habrás notado, obtendrás mucha funcionalidad cuando subclases el UIViewController. Animar la aparición y el rechazo del UIViewController sería uno de ellos.

Como marcc ha señalado si lo que desea deslizar no es una pantalla independiente, sería mejor utilizar una UIView.

Como conclusión, yo diría que si quieres usar la funcionalidad que viene con la subclasificación de UIViewController que ir por ella, conviértela en un UIViewController. De lo contrario, una UIView podría ser mejor.

La clase itunes U Standford tiene una gran conferencia sobre UIViewControllers, recomendaría verla, porque tiene mucha información sobre UIViewControllers en general.

-1

Poner todo en una pantalla en un UIViewController hasta que el controlador de vista comienza a tener demasiado código, a continuación, salir de la pantalla en varias UIViewControllers contenidas por el controlador maestro de vista de cada uno ...

Para poner esto en contexto de su respuesta, haga un controlador de vista para esa superposición modal.De todos modos, tendrá uno si está usando un controlador de navegación para presentarlo (y probablemente debería hacerlo).

+0

Subida al alza, ya que esto fue desfavorablemente downvoted a -5. La sugerencia de Kendall es una opción, en el espíritu de refactorización cuando sea necesario, en lugar de tratar de prever todo antes de tiempo. –

+0

Gracias, creo que la gente puede haber leído mal mi respuesta, así que lo actualicé para mayor claridad. O tal vez a la gente le encanta la optimización previa ... –

+0

, aunque esta respuesta no es sorprendente y es quizás un poco indirecta, acepto que se la está castigando demasiado, así que di un +1. Parece un lugar de partida decente si realmente no sabe cuándo comenzar a explotar sus VC. – bitwit

1

que tienen un enfoque algo diferente:

UIView de anulación si va a hacer el dibujo en drawRect personalizado. De lo contrario, la subclase UIViewController y utilice [self.view addSubview: bla] para agregar los componentes de la página.

Hay algunos otros casos especiales, pero que maneja alrededor del 95% de las situaciones.

(Usted todavía a menudo se necesita un UIViewController con un UIView personalizado. Pero es común tener un UIViewController encargo sin que corresponde UIView personalizado.)

0

Si está familiarizado con el patrón MVC, entonces usted debería ser capaz para entender la diferencia entre UIVIew y UIViewController. Para hacer una declaración simple, UIView es para representar elementos de la interfaz de usuario en la pantalla. UIView es la superclase de casi todos los elementos de interfaz de usuario de Cocoa Touch. Esos elementos no saben qué información se supone que deben mostrar, lo que deben hacer cuando un usuario hace clic en un botón, lo que sucede cuando una solicitud de red asíncrono se ha completado y así sucesivamente. UIViewController es para todo eso y más. El controlador de vista es responsable de colocar los elementos de la IU en las ubicaciones correctas en la pantalla, configurar los contenidos de los elementos de la IU, manejar las pulsaciones de los botones y otras entradas del usuario, actualizar el modelo cuando sea necesario, etc.

Conceptualmente, un solo control UIViewController controla el contenido de la pantalla completa en una aplicación de iPhone y es por eso que a menudo es fácil pensar en cosas en términos de controladores de vista. Si necesita una vista donde el usuario pueda seleccionar ingredientes para una receta de alimentos, necesitará un UIViewController para eso. Hice esta distinción por mí mismo porque, viniendo de un fondo Java, no estaba acostumbrado al marco que impone MVC. Pensaría en cosas en términos de UIViews, y comenzaría a implementarlas de esa manera y luego me encontraría con todo tipo de problemas debido a eso. Si usted va a pegarse a UIKit para su aplicación, a continuación, el flujo de trabajo de Apple ha hecho para usted es: para cada vista separada en su aplicación, crear una subclase UIViewController y luego utilizar el Interface Builder para colocar los elementos de interfaz de usuario y crear conexiones para los botones etc. Funciona de maravilla, ahorra una tonelada de tiempo y te permite concentrarte en hacer que tu aplicación funcione bien.

0
  1. Uso UIViewController para mostrar Ver en pantalla completa.

  2. Para un mejor control en la vista personalizada prefiero la subclase de UIViewController en lugar de UIView, antes usaba UIView para crear una subclase personalizada.

Cuestiones relacionadas