Dans un ViewController, il y a ViewDidLoad
pour savoir quand le VC a été chargé.
Pour une UIView, quelle méthode dois-je utiliser lorsque la vue est chargée?
Cette méthode serait-elle appelée avec n'importe quel init?
edit: Pas de XIB, juste par programme.
Si vous le chargez à partir d'un fichier XIB, la méthode awakeFromNib sera appelée lors de son chargement à partir du XIB.
edit Dans le cas où il n'y a pas de XIB, vous devrez probablement le déduire en utilisant l'une des méthodes du Observation Zone de modifications liées à la vue de les documents (par exemple, didMoveToSuperview). Cependant, une meilleure façon consiste à envoyer un message à vos vues à partir du contrôleur de vue dans la méthode viewDidLoad.
En réalité, vous n'avez rien à faire avec la méthode viewDidLoad () de view controller pour l'initialisation de votre vue. Tout ce que vous voulez faire, vous pouvez le faire dans la méthode init de view. Par exemple, dans viewDidLoad () du contrôleur de vue, il y a du code d'initialisation:
- (void)viewDidLoad{
[super viewDidLoad];
// init your parameters here
}
De façon similaire, dans la méthode d'initialisation de votre vue:
- (id)initWithDelegate:(id)_delegate
{
self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain];
if (self) {
[super init];
self.delegate = _delegate;
// init your parameters here
return self;
}
return nil;
}
Ensuite, vous créez YourView à partir du contrôleur de vue comme ceci:
YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];
De plus, les choses que vous voulez faire lorsque votre vue s'est chargée, vous pouvez placer dans la méthode layoutSubviews dans votre vue, comme ceci:
-(void)layoutSubviews{
[super layoutSubviews];
// init your parameters here, like set up fonts, colors, etc...
}
Je pense que c'est ce dont vous avez besoin.
À votre santé!
Swift 2:
import UIKit
class myView: UIView {
override func layoutSubviews() {
print("run when UIView appears on screen")
// you can update your label's text or etc.
}
}
Vous pouvez utiliser willMove (toSuperview newSuperview: UIView?)
import UIKit
final class myView: UIView {
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
//Do stuff here
}
}
J'ai eu un problème similaire et j'ai trouvé une solution relativement facile. L'idée est d'envoyer viewDidLoad à chaque vue enfant au bon moment et de surcharger cette méthode sur la classe de votre intérêt.
Pour ce faire, ajoutez ces parties de code dans vos classes ...
// UIViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view viewDidLoad];
}
// UIView+Loading.m
#import < UIKit/UIKit.h>
@implementation UIView (Loading)
- (void)viewDidLoad
{
for (UIView* subview in self.subviews)
[subview viewDidLoad];
}
@end
// UIView+Loading.h
#import < UIKit/UIKit.h>
@interface UIView (Loading)
- (void)viewDidLoad;
@end
// UIView_CustomImplementation
- (void)viewDidLoad
{
NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called");
}