tutorial objective life example containerviewcontroller container ios objective-c uiview uiviewcontroller

ios - objective - viewDidLoad para UIView?



lifecycle viewcontroller ios (5)

La respuesta aceptada es engañosa. Siempre se llamará a awakeFromNib, no solo si se usa una punta. De los documentos de Apple:

awakeFromNib:

Prepara el receptor para el servicio después de que se haya cargado desde un archivo de Interface Builder o un archivo de plumilla.

Link

En el siguiente ejemplo, solo he usado un storyBoard. Puedes probar esto muy fácilmente.

Este es nuestro ViewController:

ViewController.m:

#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"viewDidLoad"); } -(void)awakeFromNib { NSLog(@"awakeFromNib in view controller"); } @end

RedView.m:

#import "RedView.h" @implementation RedView -(void)awakeFromNib { NSLog(@"awakeFromNib inside RedView"); self.green.hidden = YES; } @end

Orden de impresión:

  1. awakeFromNib en controlador de vista
  2. awakeFromNib dentro de RedView
  3. viewDidLoad

Y por supuesto la vista verde quedará oculta.

Editar:

awakeFromNib no será llamado si usa solo el código para crear su vista, pero puede llamarlo usted mismo o, mejor aún, crear su propio método.

Ejemplo sin un StoryBoard (solo código):

RedView.m:

#import "RedView.h" @implementation RedView -(void)loadRedView { NSLog(@"loadRedView"); self.green = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; self.green.backgroundColor = [UIColor greenColor]; [self addSubview:self.green]; self.green.hidden = YES; } @end

ViewController.m:

#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.red = [[RedView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; self.red.backgroundColor = [UIColor redColor]; [self.view addSubview:self.red]; [self.red loadRedView]; } @end

¿Qué es viewDidLoad para UIView ?

Tengo un UIView con xib. Me gustaría ocultar una de sus subvistas cuando se carga. Traté de usar esto.

- (id)initWithCoder:(NSCoder *)aDecoder{ .... _theView.hidden = YES; }

Pero la subvista _theView es nula en este punto.

Esta respuesta no me ayudó, porque en el momento de crear el UIViewController , el UIView aún no se ha creado. Se crea programáticamente, más adelante.


No existe tal método en general. La pregunta es, ¿de dónde viene tu _theView ?

Si su vista, incluida su subvista, se carga desde el mismo nib / xib / storyboard, entonces puede usar awakeFromNib que se llamará después de que se haya cargado la jerarquía completa de objetos desde el archivo, por lo que _theView debe configurar _theView .

Si su vista se crea mediante programación pero no crea la subvista para _theView sí, eso significa que tiene que haber un lugar en su código donde agregue esa subvista. En ese caso tienes dos opciones.

  • O esconda _theView de la persona que llama después de agregarlo
  • O declare un método prepareForDisplay (o similar) en su clase de vista y llame a eso después de que se haya creado su vista y se haya asignado _theView . En el prepareForDisplay (o el nombre que elijas), puedes hacer lo que quieras, por ejemplo, ocultar _theView .

No recomendaría abusar de layoutSubviews para esto, ya que está diseñado para un propósito diferente y se llamará varias veces durante la vida útil de una vista, no solo una vez como quiera que sea. Sí, puede guardar si se llamó antes, pero yo también lo consideraría un hack. Cree mejor su propio método para inicializar la vista de la forma que desee después de configurarlo correctamente y llamar a eso.


Se llama a AwakeFromNib solo si la vista se cargó desde un archivo de plumilla. Se llama layoutSubviews para todas las vistas, puede agregar bool _loaded = yes; en la función layoutSubviews y saber si la vista está cargada.


Tratar

-awakeFromNib método

O en xib, establezca la propiedad de vista oculta para su subvista


layoutSubviews se llamará para todas las vistas que puede configurar como ocultas allí en lugar de awakeFromNib. Si está utilizando xib, puede establecer la propiedad oculta predeterminada.