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:
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:
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
_theView
de l'appelant après l'avoir ajouté 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.