ios - que - use container view swift 4
Uso adecuado de loadView y viewDidLoad con UIViewController sin nibs/xibs (2)
Como dice la documentación, no debe llamar a estos métodos usted mismo.
Cómo debe funcionar esto es que el código de UIKit llamará a su método loadView si y 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 de view
en su controlador de vista, y esa propiedad es nula, el código de UIViewController llamará al método loadView
. Si no implementa 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 intentas presentar tu controlador de vista y la vista es nula. (Esto puede ocurrir 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 usted mismo)
Si no se invocan estos métodos en su controlador de vista, debe haber algún problema con la presentación de este controlador de vista, que impide que el código de la infraestructura en UIViewController llame a estos métodos. Publica ese código y alguien puede ayudarte a descubrir ese error.
Sin embargo, antes de intentar corregir ese error, debe eliminarlos de su código:
[self loadView]
[self viewDidLoad]
Y luego, en su propia implementación de viewDidLoad
, querrá llamar a la implementación de la superclase con [super viewDidLoad]
Recuerde que en loadView
su única responsabilidad de establecer self.view en una vista válida . Eso es. El código de UIKit lo verá y llamará a viewDidLoad
por usted.
Espero que ayude.
Cuando programo sin una punta, tengo la impresión de que necesito llamar a loadView para inicializar mi vista, así:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nil bundle:nil];
if (self) {
// Custom initialization
[self loadView];
}
return self;
}
(He establecido nibNameOrNil = nil, ya que no hay plumín).
Luego, configuré la vista, así:
- (void) loadView {
self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];
[self viewDidLoad];
}
Esto es hacer todo lo demás en viewDidLoad.
Todavía no estoy seguro si se supone que debo hacer las llamadas a loadView y viewDidLoad de esta manera. No reciben llamadas automáticamente.
Lo que es confuso es en la documentación para la referencia de clase UIViewController:
Discusión de loadView
Nunca debes llamar a este método directamente. El controlador de vista llama a 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 usa Interface Builder para crear sus vistas e inicializar el controlador de vista, es decir, inicializa la vista usando el método initWithNibName: bundle: establezca directamente las propiedades nibName y nibBundle, o cree sus vistas y visualice el controlador en Interface Builder- entonces no debes 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 punta válida y usa 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 para crear sus vistas manualmente, debe hacerlo y asignar la vista raíz de su jerarquía a la propiedad de vista. (Las vistas que cree deben ser instancias únicas y no deben compartirse con ningún otro objeto controlador de vista.) Su implementación personalizada de este método no debe llamarse súper.
Si desea realizar una inicialización adicional de sus vistas, hágalo 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.
De acuerdo, hasta ahora no dice cómo se llama a viewDidLoad. Entonces para viewDidLoad:
discusión de viewDidLoad
Este método se invoca después de que el controlador de vista haya cargado sus vistas asociadas en la memoria. Se llama a este método independientemente de si las vistas se almacenaron en un archivo de punta o se crearon mediante programación en el método loadView. Este método se usa más comúnmente para realizar pasos de inicialización adicionales en vistas que se cargan desde archivos nib.
Llamado por qué?
Dado que estos métodos no se llaman automáticamente en mi código, me queda la posibilidad de pensar que tengo que llamarlos yo mismo. Pero todavía no entiendo claramente la documentación de que esto es lo correcto.
La respuesta de Firoze Lafeer es correcta, solo quiero mostrar cómo forzar la carga de la propiedad de vista de la manera correcta :
(void)self.view;
¡No deberías hacer esto! Si debe, está haciendo algo mal, pero no llame a -loadView
y -viewDidLoad
en cualquier circunstancia.