¿Qué debería usar, -awakeFromNib o -viewDidLoad?

Recientemente tuve un problema en mi aplicación donde algunas de las subvistas que estaba creando en el método -awakeFromNib la subclase -awakeFromNib desaparecían de la vista. Después de hurgar un poco encontré que mover el código que había puesto -awakeFromNib a -viewDidLoad resolvió el problema. Parece que -awakeFromNib se llama solo una vez cuando el UIViewController se desarchiva de la punta, y -viewDidLoad se llama cada vez que se desarchiva la vista.

Entonces, ¿cuál es la mejor práctica? Parece que AwakeFromNib de -awakeFromNib no debería agregar ninguna vista a la vista, ese tipo de cosas deberían hacerse en -viewDidLoad . ¿Estoy entendiendo esto correctamente? ¿O estoy más confundido de lo que pensaba?

se llama a awakeFromNib cuando el controlador en sí no se archiva desde un plumín. Se llama a viewDidLoad cuando se crea / desarchiva la vista . Esta distinción es especialmente importante cuando la vista del controlador se almacena en un archivo nib separado.

También es importante que la función awakeFromNib nunca se awakeFromNib después de la recuperación de la advertencia de memoria. Pero, se viewDidLoad función viewDidLoad .

Sí, es correcto. No deberías confiar realmente en awakeFromNib para hacer ese tipo de tareas.

awakeFromNib es similar a un evento que se llama después de la deserialización en .NET. viewDidLoad es similar al evento Load en .NET.

Si está familiarizado con los conceptos de .NET, esto debería ser suficiente, creo.

Trataré de responder dando un ejemplo:

Si define la clase customCell y el archivo customCell.xib , y luego carga la celda usando
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options , se llama a awakeFromNib cuando los objetos en el xib se desarchivan.

Si define un customViewController , entonces cuando se crea el customViewController usando - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil . Se llamará a viewDidLoad cuando se cargue en la jerarquía de vista.

Algunos métodos confusos relacionados:

  • (void) loadView; Aquí es donde las subclases deberían crear su jerarquía de vista personalizada si no están usando un plumín. Si no especifica un nombre de punta, entonces loadView intentará cargar una punta cuyo nombre sea el mismo que la clase de su controlador de vista. Si no existe tal plumín, entonces debe invocar -setView: before -view es invocado, o anular el método -loadView para configurar sus vistas programáticamente. -loadView nunca debe ser llamado directamente.

  • (void) viewDidLoad: Se invoca después de que se ha cargado la vista. Para viewControllers creados en código, esto es after -loadView. Para los controladores de vista desarchivados de una plumilla, esto es después de que se establece la vista.