NSWindowController windowDidLoad pas appelé
-
01-10-2019 - |
Question
J'ai une application simple de cacao en utilisant une sous-classe NSWindowController. Dans la plume, j'ai ensemble:
- la classe de fichier propriétaire à ma NSWindowController sous-classe
- La sortie « Window » du propriétaire du fichier au principal NSWindow dans la pointe.
La méthode init de ma sous-classe NSWindowController est appelé (je l'appelle super), mais peu importe ce que je ne windowDidLoad est jamais appelé.
Je dois manquer quelque chose d'évident, mais pour la vie de moi je ne peux pas comprendre ce qu'elle est.
La solution
Vous essayez de créer l'instance de NSWindowController
par instanciation dans une autre plume. Toutefois, lorsque vous instancier un objet dans un fichier nib, il est initialisé en appelant -initWithCoder:
.
-initWithCoder:
n'est pas désigné initialiseur de NSWindowController
, de sorte que votre instance de NSWindowController
jamais réellement charge sa plume.
Au lieu d'instancier votre instance NSWindowController
en le plaçant dans le fichier MainMenu.xib
dans Interface Builder, créez programme:
AppDelegate.h :
@class YourWindowController;
@interface AppDelegate : NSObject
{
YourWindowController* winController;
}
@end
AppDelegate.m :
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification*)notification
{
winController = [[YourWindowController alloc] init];
[winController showWindow:self];
}
- (void)dealloc
{
[winController release];
[super dealloc];
}
@end
YourWindowController.m :
@implementation YourWindowController
- (id)init
{
self=[super initWithWindowNibName:@"YourWindowNibName"];
if(self)
{
//perform any initializations
}
return self;
}
@end
Autres conseils
Il est tout à instancier le contrôleur de fenêtre par une pointe. Au contraire, dans ce cas que l'utilisation windowDidLoad
comme crochet, vous aurez envie d'utiliser awakeFromNib
.
La fenêtre peut être chargée à la demande - essayez d'envoyer window
à vous dans -init
. Voir la discussion de -[NSWindowController loadWindow]
dans la documentation pour plus d'informations.
si vous avez écrit
TTEst *test3 = (TTEst *)[[NSWindowController alloc] initWithWindowNibName:@"TTEst"];
essayer place
TTEst *test3 = [[TTEst alloc] initWithWindowNibName:@"TTEst"];
il fait la différence! Bien sûr, la première ligne était une erreur ...