2012-01-16 9 views
23

Cuando programa sin una punta, estoy bajo la impresión de que tengo que llamar loadView para inicializar mi punto de vista, como esto:El uso adecuado de loadView y viewDidLoad con UIViewController sin puntas/xibs

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     // Custom initialization 
     [self loadView]; 
    } 
    return self; 
} 

(I . han establecido nibNameOrNil = nula, ya que no hay mina)

Entonces, me juego hasta la vista, así:

- (void) loadView { 
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)]; 
    [self viewDidLoad]; 
} 

ésta es hacer todo lo demás en viewDidLoad.

Todavía no estoy seguro de si debo hacer las llamadas a loadView y viewDidLoad de esta manera. No reciben llamadas automáticamente.

Cuál es confuso es en la documentación de la referencia de clase UIViewController:

loadView Discusión

Nunca se debe llamar a este método directamente. El controlador de vista llama al este método cuando se solicita la propiedad de vista, pero actualmente es nula. Si crea sus vistas manualmente, debe anular este método y usarlo para crear sus vistas. Si utiliza Interface Builder para crear sus puntos de vista e inicializar la vista del controlador, es decir, inicializar la vista utilizando el initWithNibName: paquete: método, establece la nibName y propiedades nibBundle directamente, o crear tanto sus puntos de vista y vista controlador en Interface Builder; entonces no debe anular este método .

Por lo tanto, no entiendo cómo se llama a loadView si nunca debo llamarlo directamente.

La implementación predeterminada de este método busca información de nib válida y utiliza esa información para cargar el archivo nib asociado. Si no se especifica información de punta, la implementación predeterminada crea un objeto UIView simple y la convierte en la vista principal.

No entiendo cómo funciona eso: la creación de un dolor UIView.

Si reemplaza este método con el fin de crear sus puntos de vista de forma manual, debe hacerlo y asignar la vista raíz de la jerarquía de la propiedad vista. (Las vistas que cree deben ser instancias únicas y no se deben compartir con ningún otro objeto de controlador de vista.) Su implementación personalizada de este método no debe llamar a super.

Si desea realizar una inicialización adicional de sus vistas, realice en el método viewDidLoad. En iOS 3.0 y posterior, también debe anular el método viewDidUnload para liberar cualquier referencia a la vista o su contenido.

Bien, hasta ahora no dice cómo se llama a viewDidLoad. Así que para viewDidLoad:

viewDidLoad Discusión

Este método se llama después de que el controlador de vista se ha cargado su vistas asociadas en la memoria. Este método se llama independientemente de si las vistas se almacenaron en un archivo de punta o se crearon programáticamente en el método loadView. Este método es más comúnmente utilizado para realizar pasos de inicialización adicionales en vistas que están cargadas desde archivos nib.

Llamado por qué?

Dado que estos métodos no se llaman automáticamente en mi código, me queda la sensación de que tengo que llamarlos yo mismo. Pero todavía no entiendo claramente la documentación de que esto es lo correcto.

+0

Hola @Draco Por favor, comienza una recompensa por esta pregunta ... Todavía estoy sufriendo de esta situación? – Vishal16

Respuesta

33

Como dice la documentación, usted no debe llamar a estos métodos usted mismo.

Cómo funciona esto es que el código de UIKit llamará a su método loadView si y cuando realmente necesita presentar la jerarquía de vista de ese controlador en la pantalla.

Específicamente, si algún código intenta leer su propiedad view en su controlador de vista, y esa propiedad es nula, entonces el código de UIViewController llamará al método loadView. Si no implementa el loadView usted mismo, la implementación predeterminada se reducirá a intentar cargar la jerarquía de vista desde el plumín.

Todo esto sucede automáticamente cuando intenta presentar su controlador de vista y la vista es nula. (Esto puede suceder varias veces mientras su aplicación se está ejecutando si su controlador de vista tiene que descargar su vista en respuesta a la presión de la memoria, otro comportamiento que obtiene 'gratis' y que no desea llamarse a sí mismo)

If estos métodos no se invocan en su controlador de vista, entonces debe haber algún problema con la presentación de este controlador de vista, que impide que el código de marco en UIViewController invoque estos métodos. Publica ese código y alguien puede ayudarte a descubrir ese error.

Antes de intentar solucionar que fallo, sin embargo, se debe eliminar estos de su código:

[self loadView] 
[self viewDidLoad] 

Y luego en su propia implementación de viewDidLoad, tendrá que llamar a la implementación de la superclase con [super viewDidLoad]

Recuerde que en loadView su única responsabilidad de establecer self.view hasta cierto punto de vista válido. Eso es. El código de UIKit lo verá y llamará al viewDidLoad.

Espero que ayude.

+0

Todavía estoy pensando en tu respuesta. Esto sin duda influirá en mi enfoque de todas las inicializaciones y el inicio de cada vista importante con el controlador de vista. Si puedo entender esto, me ayudará a ver la administración de la memoria. Lo que no entiendo es cómo obtener esa primera referencia a la propiedad self.view. Por ejemplo, si va a una pila de controlador de navegación, mi código se refiere al controlador de vista y no a la propiedad de vista. Puede que tenga que experimentar, pero mi experiencia es diciéndome que esto no va a hacerlo. – Draco

+0

Tomemos el ejemplo del controlador nav: inserta una nueva vc en la pila y UIKit intentará animar en la vista de ese vc. Su punto de vista será nulo en ese punto, por lo que el marco (su código, no el suyo) llamará a loadView. –

+0

Bien, gracias. Lo probaré esta noche. – Draco

7

La respuesta por Firoze Lafeer es correcta, sólo quiero mostrar cómo carga de fuerza la ventana de propiedades de la forma correcta :

(void)self.view; 

que no debería hacer esto! Si debe, está haciendo algo mal, pero no llame al -loadView y -viewDidLoad usted mismo en cualquier circunstancia.

+4

Gracias por la votación negativa. Alguien obviamente le gusta llamar a los métodos de carga de vista. – Tricertops

+0

Parece que downvoted esto en un punto y realmente no sé por qué. No puedo deshacerlo. –

Cuestiones relacionadas