2009-04-01 6 views
0

Je souhaite afficher un écran d'accueil avant le déjeuner App. D'abord, je fais la SplashWindow sous-classement du NSWindow, le code est:Pourquoi la fenêtre de démarrage ne peut pas être affichée avant le lancement de l'application?

- (id)initWithContentRect(NSRect)contentRect 
styleMask(unsigned int)aStyle 
backing(NSBackingStoreType)bufferingType 
defer(BOOL)flag { 

self = [super initWithContentRect:contentRect 
styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 
[self setBackgroundColor: 
[NSColor clearColor]]; 
[self setLevel: NSStatusWindowLevel]; 
[self setAlphaValue:1.0]; 
[self setOpaque:NO]; 
[self setHasShadow: YES]; 
return self; 

} 

puis dans la veille de pointe dans le contrôleur de l'application principale:

loadWindow = [[NSWindow alloc] initWithContentRect:[loadWindow frame] styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; 
[loadWindow setContentView:theView]; 
[loadWindow setHasShadow:YES]; [ 
loadWindow setLevel:NSStatusWindowLevel]; 
[loadWindow makeKeyAndOrderFront:self]; 

puis je laisse le loadWindow fermé après 3 secondes , J'ai utilisé la méthode [loadWindow orderOut: self], mais quand la fenêtre splash s'est fermée, le mainwinow ne s'est pas montré. Qu'est-ce que je rate? Mon application est un multi_Documents. et dans le mainMenu.nib il y avait une fenêtre (loadwindow), dans IB j'ai connecté la sortie loadWindow dans le contrôleur principal. J'ai également connecté la vue et l'image. et j'ai changé d'une autre façon: dans la méthode déléguée: applicationWillFinishLaunching: Je commandeFront la loadWindow, dans la méthode: applicationDidFinishLaunching: Je commandeOut la loadWindow après 3 secondes, mais la mainWindow n'a pas montré trop.Certains peuvent donner des conseils ou des codes le résultat le problème? Merci beaucoup!

Répondre

3

Réponse au titre: Parce que votre application ne fonctionne pas encore. Une application qui n'est pas en cours d'exécution ne peut rien faire.

réponse sérieuse à la question:

D'abord, vous n'avez pas besoin de sous-classe NSWindow. Deuxièmement, vous n'instanciez pas votre sous-classe, vous instanciez NSWindow. C'est pourquoi vous n'obtenez pas le comportement de votre sous-classe. (Et c'est ce que vous devriez faire, puisque vous n'avez pas besoin de la sous-classe.)

Troisièmement, vous essayez de demander une fenêtre qui n'existe pas encore pour le cadre que vous utiliserez pour le créer. . loadWindow est nil jusqu'à après vous créez quelque chose et le stockez là. Quatrièmement, parce que vous demandez nil pour sa trame, vous obtenez un rectangle de déchets. Ensuite, vous créez une fenêtre avec ce rectangle de déchets. Sans surprise, lorsque vous placez cette fenêtre sur l'écran, elle apparaît dans une position aléatoire (probablement hors écran) avec une taille aléatoire (probablement trop grande pour créer ou négative). Cinquièmement, qu'est-ce qui vous fait penser que dire à une fenêtre de commander entraînerait l'ouverture d'une autre fenêtre? Comment est-ce censé savoir quelle fenêtre commander?

En laissant de côté la réalité indéniable que the very existence of a splash screen punishes the user for using your application, vous devez utiliser NSWindowController pour charger la fenêtre et de faire votre installation tels que setBackgroundColor: et setLevel:. Et dans votre méthode de minuterie, où vous commandez la fenêtre de démarrage, vous devez également explicitement ordre dans la fenêtre principale.

0

Je ne vois rien qui fasse apparaître une autre fenêtre dans le code que vous avez posté. Pourquoi n'essayez-vous pas d'envoyer votre fenêtre principale makeKeyAndOrderFront:?

Questions connexes