2010-07-18 19 views
0

J'ai hérité d'une nouvelle classe de NSWindowController à mettre en œuvre windowDidLoad et l'accès aux commandes de la fenêtre définie NIB:L'accès à la fenêtre NIB contrôle

- (void) windowDidLoad 
{ 
    NSArray * controls = [ [ [ self window ] contentView ] subviews ]; 
    int i; 

    NSRunAlertPanel(@"windowDidLoad", @"", @"OK", NULL, NULL); 

    if([ controls count ] == 0) 
     NSRunAlertPanel(@"no hay controles", @"", @"OK", NULL, NULL); 

    for(i = 0; i < [ controls count ]; i++) 
     NSRunAlertPanel(@"control", @"", @"OK", NULL, NULL); 
} 

exécution de code va bien. La fenêtre NIB est affichée, mais les sous-vues n'ont aucun élément. Comment accéder aux contrôles enfants de la fenêtre? Merci,

Répondre

1

La fenêtre NIB est affichée, mais subviews n'a aucun élément.

Vous avez probablement oublié de raccorder la fenêtre à votre fenêtre. Lorsque la sortie n'est pas branchée, la propriété de sortie contient nil, alors [self window] renvoie nil.

Ensuite, vous envoyez des messages à nil. Je dis "messages" parce que every message to nil does nothing and returns nil, 0, or 0.0 as appropriate. Cela signifie que vous envoyez le message contentView à nil, de sorte que renvoie nil, ce qui signifie que vous envoyez le message subviews à nil, de sorte que renvoie également nil. Comme je l'ai dit, un message à nil renvoie nil, 0 ou 0.0; lorsque vous envoyez le message count à controls, puisque controls est nil comme expliqué dans le paragraphe précédent, ce message renvoie 0.

La solution est d'ouvrir votre plume dans IB et de connecter la sortie window de votre contrôleur à votre fenêtre. À propos, vous ne devriez pas utiliser d'index pour faire une boucle sur NSArrays. Il existe une façon plus simple et plus propre de le faire: Fast Enumeration.

+0

La classe windowController héritée est créée par programmation. Comment brancher la sortie de la fenêtre? merci, –

+0

Je pense que vous confondez une classe avec une instance. L'objet contrôleur de fenêtre est une instance de la classe NSWindowController ou d'une classe qui hérite de NSWindowController. Faire quelque chose «par programmation» signifie le faire dans une ou plusieurs déclarations; créer une classe par programmation est très difficile (pour ne pas dire inutile), donc vous voulez presque certainement l'instancier, ce qui n'est pas pertinent: il n'y a pas d'autre moyen d'instancier un NSWindowController. (Vous * pourriez * en créer un dans une plume, mais cela ne servirait à rien.) –

+0

En ce qui concerne la connexion de la prise: http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/ –