2008-11-11 13 views
6

Estoy tratando de entender las funciones de UIViews y UIViewControllers. Si estoy creando e insertando subvistas programáticamente, ¿es típico hacer esto desde la vista o el controlador?UIViewController vs. UIView: ¿cuál debería crear las subvistas?

realmente estoy preguntando si hay una convención/patrón para esto. En mi aplicación de ejemplo, estoy cargando 50 imágenes en tiempo de ejecución, agregándolas como subvistas a la vista principal, y luego dejando que el usuario las arrastre por la pantalla. Actualmente estoy haciendo todo el inicialización en initWithCoder de la vista:

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if (self = [super initWithCoder:coder]) { 
     // load UIImageViews and add them to the subview 
    } 

    return self; 
} 

La vista también implementa touchesBegan/touchesMoved para permitir arrastrar. Mi problema surge cuando intento acceder [self frame] .size en initWithCoder, parece que todavía no se ha inicializado. Esto me hace pensar que se esté cargando las imágenes en el lugar equivocado ...

+0

Depende de lo que estás haciendo con ellos ... por lo general se utiliza un controlador de vista cuando se desea una vista de pantalla completa con auto rotación, etc., o cuando se desea insertar una vista de pantalla completa para algo así como una controlador de pestañas ¿Puedes ampliar tu pregunta un poco? –

Respuesta

7

Depende de lo que está haciendo. Si la vista representa algo "empaquetado", entonces crea subvistas desde la vista misma. Si solo está agregando vistas juntas, entonces debe hacerlo desde el controlador de vista.

Piense en la encapsulación tradicional. ¿Su subvista es conceptualmente "parte" de su super visión, o simplemente vive allí en la jerarquía del dibujo?

+0

He actualizado la pregunta con más información. En mi caso, la vista es solo parte de la jerarquía, pero también implementa los toquesBegan/touchesMoved para permitir el arrastre. –

+0

Después de leer un poco, parece que el controlador en sí puede responder a estos eventos, en cuyo caso puedo hacer todo desde el controlador. –

2

Suponga que está creando una vista que contiene algunos controles, como para editar un disco con múltiples campos o algo así. Como va a utilizar esos campos de texto y sus datos en el controlador de vista, conceptualmente "pertenecen" al controlador de visualización, y la vista principal existe solo para fines de agrupación y diseño. Este es probablemente el escenario más común.

Si estuviera creando una vista subclase de comportarse como un nuevo control, por ejemplo, entonces yo diría que se debe crear y gestionar los puntos de vista totalmente dentro de la clase de vista. Me imagino que este caso ocurrirá con menos frecuencia en la práctica.

2

Parece que puede estar agregándolos en el lugar equivocado. Si movió la adición de las subvistas en ViewController, entonces podría hacer este trabajo en viewDidLoad y se le garantizaría que la vista principal ya estaba inicializada y lista para acceder.

1

maniquí explicación sería así:

Subclase UIViewController cada vez que se va a mostrar la vista como modal (presentModalViewController) o en el interior UINavigationController (pushViewController) UIView

Subclase cada vez que se trata de un pequeño componente dentro de la vista principal ... por ejemplo que desea hacer botón personalizado o ...

Más específicamente en su ejemplo ... si usted está inicializando UIViewControllers se pueden establecer las propiedades de vista, por ejemplo. como el tamaño del marco solo después de que su vista se haya agregado a la supervista. Solo en ese punto UIViewController carga e inicializa su vista.

Creo que en su caso debe usar UIViews ... puede establecer el tamaño del marco inmediatamente después de asignar & inicializándolos.

Cuestiones relacionadas