web-dev-qa-db-fra.com

iOS viewDidLoad pour UIView

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.

57
manuelBetancurt

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.

43
borrrden

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é!

7
akelec

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.
  }
}
6
fatihyildizhan

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
   }

} 

Apple Docs

6
davidrynn

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");

}
2
vedrano