2010-09-29 25 views
3

J'ai une classe qui étend NSWindowController et j'essaie de positionner la fenêtre qu'il contrôle. La fenêtre affiche correctement tous les contenus et fonctions attendus, mais lorsque j'essaie de positionner son emplacement de départ sur l'écran dans la méthode initWithWindowNibName, la position ne change pas. Voici le code:Impossible de définir la position d'un NSWindow

NSPoint p = NSMakePoint(100, 50); 
[[self window] setFrameTopLeftPoint:p]; 

Cela semble très simple et je ne sais pas quel est le problème.

Merci pour vos idées.

(trouvé le problème. Je n'ai pas la fenêtre câblé à la classe IB.)

+0

Une déclaration et une ligne de code ne suffisent pas. Si je copie et colle ce code dans mon programme, cela fonctionnera, ce qui signifie que je ne peux pas reproduire votre bogue. – Chuck

Répondre

1

Essayez de mettre ce code dans awakeFromNib.

3

Wevah a la bonne idée, même si j'essaierai de l'élargir un peu.

Si vous deviez essayer d'ajouter cette ligne à votre méthode initWithWindowNibName::

NSLog(@"window == %@", [self window]); 

vous aurait probablement la sortie suivante à la console:

window == (null) 

En d'autres termes, la fenêtre est toujours nil , car les méthodes init* sont si précoces dans la vie d'un objet que de nombreux éléments de l'interface IBOutlet ou de l'interface utilisateur ne sont pas encore "branchés".

Envoyer un message à nil est parfaitement bien: il est simplement ignoré. Donc, fondamentalement, votre tentative de positionner la fenêtre n'a aucun effet, car elle équivaut à [nil doSomething];

La clé consiste alors à effectuer le positionnement de la fenêtre plus tard dans la durée de vie de l'objet contrôleur, où IBOutlet s et d'autres objets de l'interface utilisateur sont correctement connectés. Comme Wevah fait allusion, une telle méthode où les choses sont correctement raccordés est

- (void)awakeFromNib; 

ou dans le cas de NSWindowController, le suivant ainsi:

- (void)windowDidLoad; 

Hope this helps ...