viewDidLoad pour UIView?

Quelle est viewDidLoad pour UIView ?

J'ai un UIView avec xib. Je voudrais cacher l'un de ses sous-vues quand il est chargé. J'ai essayé d'utiliser ça.

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

Mais la sous-vue _theView est nulle à ce stade.

Cette réponse ne m'a pas aidé, car au moment de créer le UIViewController , l' UIView n'est pas encore créé. Il est créé par programme, plus tard.

AwakeFromNib est appelée uniquement si la vue est chargée à partir du file nib. layoutSubviews est appelé pour toutes les vues, vous pouvez append bool _loaded = yes; dans la fonction layoutSubviews et savoir si la vue est chargée.

Essayer

-awakeFromNib méthode

Ou dans xib définir la propriété vue masquée pour votre sous-vue

La réponse acceptée est trompeuse. awakeFromNib sera toujours appelé, pas seulement si une plume est utilisée. De la pomme docs:

awakeFromNib:

Prépare le récepteur pour le service après qu'il a été chargé depuis une archive Interface Builder ou un file nib.

Lien

Dans l'exemple suivant, je n'ai utilisé qu'un storyboard. Vous pouvez le tester très facilement.

C'est notre ViewController:

entrez la description de l'image ici

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 

Ordre d'printing:

  1. awakeFromNib dans le controller de vue
  2. awakeFromNib à l'intérieur de RedView
  3. viewDidLoad

Et bien sûr, la vue verte sera cachée.


Modifier:

awakeFromNib ne sera pas appelé si vous utilisez uniquement du code pour créer votre vue, mais vous pouvez l'appeler vous-même ou, mieux encore, créer votre propre méthode.

Exemple sans StoryBoard (code uniquement):

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 

Il n'y a pas de telle méthode en général. La question est, d'où vient votre _theView .

Si votre vue, y compris sa sous-vue, est chargée à partir du même nib / xib / storyboard, vous pouvez utiliser awakeFromNib qui sera appelée après que la hiérarchie complète des objects a été chargée à partir de l'archive, ainsi votre _theView devrait également être défini.

Si votre vue est créée par programmation mais ne crée pas la sous-vue pour _theView , cela signifie qu'il doit y avoir une place dans votre code où vous ajoutez cette sous-vue. Dans ce cas, vous avez deux options

  • Soit cacher _theView de l'appelant après l'avoir ajouté
  • Ou déclarez une méthode prepareForDisplay (ou similaire) sur votre class de vue et appelez-la après que votre vue a été créée et que _theView a été assigné. Dans cette prepareForDisplay (ou quel que soit le nom que vous choisissez), vous pouvez faire ce que vous voulez, par exemple cacher _theView .

Je ne reorderais pas d'abuser de layoutSubviews car il est destiné à un but différent et sera appelé plusieurs fois pendant la durée de vie d'une vue, et pas seulement une fois comme vous le souhaitez. Oui, vous pouvez save si elle a été appelée avant, mais je considérerais cela comme un hack. Mieux vaut créer votre propre méthode pour initialiser la vue comme vous le souhaitez après l'avoir correctement configurée et l'appeler.

layoutSubviews sera appelé pour toutes les vues que vous pouvez définir comme masquées ici au lieu de awakeFromNib. Si vous utilisez xib, vous pouvez définir la propriété cachée par défaut.