2009-08-11 7 views
1

Donc j'essaie de faire cet exercice où j'ai besoin de définir un délégué pour la fenêtre principale. Le but est de s'assurer que lorsque l'utilisateur redimensionne la fenêtre, il est toujours deux fois plus large que haut.Objectif C Délégué pour la fenêtre principale de l'application

Ceci est mon fichier AppController.h:

#import <Cocoa/Cocoa.h> 

@interface AppController : NSObject 
{ 
    NSWindow *windowWillResize; 
} 

@end 

et ceci est mon fichier AppController.m:

#import "AppController.h" 

@implementation AppController 

- (id) init 
{ 
    [super init]; 
    windowWillResize = [[NSWindow alloc] init]; 
    [windowWillResize setDelegate:self]; 

    return self; 
} 

- (NSSize) windowWillResize:(NSWindow *)sender 
       toSize:(NSSize)frameSize; 
{ 
    NSLog(@"size is changing"); 
    return frameSize; 
} 

@end 

Cependant, je peux supprimer la ligne [windowWillResize setDelegate: auto]; depuis que j'ai défini le délégué dans Interface Builder, mais je ne sais pas pourquoi cela fonctionne.

Comment windowWillResize sait-il que je fais référence à la fenêtre principale de l'application puisque je suis en train de créer un tout nouveau windowWillResize = [[NSWindow alloc] init]; Je sens que je me trompe complètement. Quelqu'un peut-il m'indiquer la bonne direction? Merci!

Répondre

3

En effet, vous n'avez pas besoin de créer un NSWindow *windowWilResize car une application Cocoa nouvellement créée possède déjà une fenêtre principale. Vous n'avez pas non plus besoin d'implémenter une méthode -init.

Vous devez uniquement définir appController en tant que délégué de votre fenêtre principale dans Interface Builder et implémenter la méthode -windowWillResize: dans votre appController.

Si vous êtes familier avec la langue française, vous pouvez jeter un coup d'œil sur un article de blog que j'ai écrit à ce sujet: Délégation en Cocoa.

+0

Merci Graham et mouviciel. Je pensais que ma création de NSWindow était incorrecte. La chose que je ne savais pas, c'est que windowWillResize est une fonction intégrée. Alors, voici ma question suivante, si je n'utilisais pas l'interface builder, y a-t-il dans mon code de spécifier que je veux que appController soit le délégué de MainWindow? – hahuang65

+0

Oh, attends, maintenant je suis confus ... comment windowWillResize sait-il contrôler la fenêtre principale? Je l'ai déclaré dans le fichier d'en-tête, mais je ne le connecte nulle part à la fenêtre principale. Je ne mets que appController en tant que délégué ... Comment la fonction windowWillResize se lie-t-elle au redimensionnement actuel? – hahuang65

+0

La définition de appController en tant que délégué dans Interface Builder permet de connecter -windowWillResize à la fenêtre principale. Chaque fois qu'un utilisateur demande un redimensionnement de la fenêtre principale, l'instance de la fenêtre envoie un message [delegate windowWillResize: ...] où delegate = appController. – mouviciel

2

Vous avez une fuite de l'instance NSWindow. Dans -init, vous créez une instance NSWindow. Cependant, cela n'est pas utilisé car lorsque la NIB se charge, elle configure toutes les connexions que vous avez spécifiées dans Interface Builder et vous commencez à utiliser la fenêtre de la NIB à la place. Ne créez pas un objet fenêtre dans le code - Interface Builder le fait pour vous! :-)

En fait, ce n'est pas tout à fait "à la place"; votre contrôleur d'application est maintenant le délégué pour instancesNSWindow instances - celui qui vient de la NIB et celui que vous avez instancié en -init. Cependant, comme le code NSWindow n'est jamais utilisé nulle part ailleurs, il est toujours redondant et doit être supprimé.

1

Si vous voulez juste pour maintenir le ratio d'aspect de la fenêtre, vous pouvez utiliser l'une de ces deux NSWindow méthodes:

  • setAspectRatio:(NSSize)
  • setContentAspectRatio:(NSSize)

La première méthode verrouille toute la fenêtre taille, y compris la barre de titre. Le deuxième juste le contenu. Vous pouvez appeler cette méthode lors de l'initialisation de votre fenêtre dans le délégué (par exemple: -applicationDidFinishLaunching)

Questions connexes