0 votes

Pourquoi la fenêtre d'accueil ne peut-elle pas s'afficher avant le lancement de l'application ?

Je veux montrer un écran d'accueil avant le déjeuner de l'application. D'abord, je crée la SplashWindow en sous-classant la NSWindow, le code est :

- (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;

}

et ensuite dans l'awake de nib 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];

et ensuite j'ai laissé le loadWindow se fermer 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 manque ? 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é une autre façon : dans la méthode de délégué: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é aussi.quelqu'un peut donner quelques conseils ou codes le résultat le problème ? Merci beaucoup !

3voto

Peter Hosey Points 66275

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

Réponse sérieuse à la question :

Tout d'abord, vous n'avez pas besoin de sous-classer 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 le cadre que vous utiliserez pour la créer. loadWindow es nil jusqu'à après vous créez quelque chose et le stockez là.

Quatrièmement, parce que vous demandez nil pour son cadre, vous obtenez un rectangle vide en retour. Ensuite, vous créez une fenêtre avec ce rectangle vide. Sans surprise, lorsque vous affichez cette fenêtre à l'écran, elle apparaît à une position aléatoire (probablement hors écran) avec une taille aléatoire (probablement trop grande pour être créée ou négative).

Cinquièmement, qu'est-ce qui vous fait penser que dire à une fenêtre de commander à l'extérieur amènerait une autre fenêtre à commander à l'intérieur ? Comment est-il censé savoir quelle fenêtre doit commander ?

En laissant de côté la réalité indéniable que l'existence même d'un écran d'accueil punit l'utilisateur d'utiliser votre application vous devriez utiliser le NSWindowController pour charger la fenêtre et effectuer vos configurations telles que setBackgroundColor: y setLevel: . Et dans votre méthode de minuterie, où vous commandez par la fenêtre d'éclaboussure, vous devez aussi explicitement dans la fenêtre principale.

0voto

Chuck Points 138930

Je ne vois rien qui puisse faire 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: ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X