39 votes

Avez-vous déjà utilisé viewDidLoad dans NSViewController?

Sur l'iPhone, j'utilise UIViewController's viewDidLoad pour exécuter du code afin de configurer la vue.

Comment puis-je faire cela avec NSViewController ?

J'ai essayé loadView mais cela ne fonctionne pas...

49voto

Chintan Patel Points 2378

J'ai résolu le problème quelques minutes après avoir posté mon commentaire. J'ajoute mes conclusions en tant que réponse car c'est un exemple qui manque dans la documentation. Le code ci-dessous vous donnera la méthode viewDidLoad que vous souhaitez. C'est tellement facile que je me demande pourquoi Apple ne l'a pas encore implémenté dans OS X.

- (void)viewWillLoad {
    if([NSViewController instancesRespondToSelector:@selector(viewWillLoad)]) {
        [super viewWillLoad];
    }

    ...
}

- (void)viewDidLoad {
    if([NSViewController instancesRespondToSelector:@selector(viewWillLoad)]) {
        [super viewDidLoad];
    }
}

- (void)loadView {
    BOOL ownImp = ![NSViewController instancesRespondToSelector:@selector(viewWillLoad)];

    if(ownImp) {
        [self viewWillLoad];
    }

    [super loadView];

    if(ownImp) {
        [self viewDidLoad];
    }
}

Source originale : http://www.cocoabuilder.com/archive/cocoa/195802-garbage-collection-leaks-and-drains.html

7 votes

Un danger possible de ceci est qu'Apple pourrait ajouter les méthodes -viewWillLoad et -viewDidLoad à un jour donné. Si tel est le cas, votre remplacement de ces méthodes serait appelé deux fois.

0 votes

Merci beaucoup pour cette solution ! J'avais cherché pendant des semaines pour cela.

1 votes

@Mike... Votre préoccupation est légitime et maintenant avec 10.7 Lion devenant plus comme iOS, je pense que cela pourrait bien être inclus dans Lion lui-même. Je vais surveiller cela donc ne t'inquiète pas pour moi mais oui, avoir les mêmes noms de fonction peut causer des problèmes sinon.

42voto

Mike Abdullah Points 9464

Dès OS X 10.10, viewDidLoad est disponible et pris en charge sur NSViewController.

Auparavant, vous deviez vous référer à cette information dans les notes de publication de Snow Leopard :

Conseils pour les personnes recherchant les méthodes -viewWillLoad et -viewDidLoad dans NSViewController

Même si NSWindowController possède les méthodes -windowWillLoad et -windowDidLoad que vous pouvez remplacer, la classe NSViewController introduite dans Mac OS 10.5 n'a pas de méthodes correspondantes -viewWillLoad et -viewDidLoad. Vous pouvez remplacer -[NSViewController loadView] pour personnaliser ce qui se passe immédiatement avant ou immédiatement après le chargement du nib effectué par un contrôleur de vue.

0 votes

J'ai posé la question sur stackoverflow.com/questions/4492485/… mais je pourrais aussi vous demander : j'ai lu cela dans la documentation et j'ai essayé de jouer avec loadView mais je ne comprends toujours pas comment cela aide à faire quelque chose "immédiatement après le chargement du nib". J'ai un NSTabView dans le fichier xib qui est correctement connecté mais il est toujours à 0x0 lorsque je mets un point d'arrêt dans loadView.

3 votes

-1; Obsolète! L'article lié ne parle plus de cela. :(

1 votes

Je pense que [viewController loadView] n'est pas une méthode capable de remplacer viewDidLoad. Car cette méthode sera appelée par le système à chaque fois que [viewController view] est appelé. Ainsi, cette méthode peut être appelée plusieurs fois dans une application en cours d'exécution.

9voto

mz2 Points 520

À partir de OSX 10.10 (Yosemite), il existe désormais un -viewDidLoad, -viewWillAppear, -viewDidAppear, -viewWillDisappear dans NSViewController. Voir WWDC 2014 - Storyboards and Controllers on OS X session pour plus d'infos, pour savoir quand chacun d'eux est appelé, etc.

Voici l'extrait pertinent de la documentation de l'en-tête 10.10 sur -viewDidLoad:

Appelé après le chargement de la vue. Pour les contrôleurs de vue créés en code, c'est après -loadView. Pour les contrôleurs de vue désarchivés à partir d'un nib, c'est après que la vue est définie. Par défaut ne fait rien.

- (void)viewDidLoad NS_AVAILABLE_MAC(10_10);

0 votes

Je peux confirmer cela.. à partir de Xcode6-B4 le patron fourni par Apple pour une sous-classe NSVewController inclut - (void)viewDidLoad { [super viewDidLoad]; // Faire la configuration de la vue ici. }!

5voto

Jesus Points 722

Pourquoi n'essayez-vous pas ceci :

- (void)awakeFromNib {
    //code de configuration
    NSLog(@"bonjour");
}

1 votes

J'ai tendance à éviter de faire des choses dans awakeFromNib, car cela peut parfois être appelé plus d'une fois. Par exemple, appeler makeViewWithIdentifier:owner: et passer self comme propriétaire provoquera l'appel de awakeFromNib. Voir developer.apple.com/library/mac/documentation/Cocoa/Conceptu‌​al/….

0 votes

Kyle je fais face au même problème, awakeFromNib appelé plusieurs fois en raison de makeViewWithIdentifier: owner

1voto

Ninja Points 981

Il semble que dans 10.10, viewDidLoad se trouve maintenant dans NSViewController.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X