2009-04-01 4 views
0

Ich möchte einen Begrüßungsbildschirm vor dem App-Mittagessen zeigen. Zuerst habe ich die SplashWindow Subklassen die NSWindow zu machen, ist der Code:Warum kann das Begrüßungsfenster vor dem Start der App nicht angezeigt werden?

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

} 

und dann im Wach aus Spitze in der Haupt App Controller:

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

und dann lasse ich die LOADWINDOW nach 3 secondes geschlossen Ich habe die Methode [loadWindow orderOut: self] verwendet, aber als das Begrüßungsfenster geschlossen wurde, wurde das Hauptfenster nicht angezeigt. Was vermisse ich? Meine App ist ein multi_Documents. und in der mainMenu.nib gab es ein Fenster (loadwindow), in IB habe ich den loadWindow outlet in der Hauptsteuerung angeschlossen. Ich habe auch die Ansicht und das Bild verbunden. und ich änderte einen anderen Weg: in der Delegate-Methode: applicationWillFinishLaunching: Ich orderFront das LoadWindow, in der Methode: applicationDidFinishLaunching: Ich orderOut das LoadWindow nach 3 Sekunden, aber das mainWindow nicht zu sehen.Menschen kann einen Rat geben oder das Ergebnis codiert das Problem? Vielen Dank!

Antwort

3

Antwort zum Titel: Weil Ihre App noch nicht läuft. Eine Anwendung, die nicht ausgeführt wird, kann nichts tun.

Ernsthafte Antwort auf Frage:

Erstens brauchen Sie nicht NSWindow Unterklasse.

Zweitens Instanziieren Sie nicht Ihre Unterklasse, Sie instanziieren NSWindow. Aus diesem Grund erhalten Sie nicht das Verhalten Ihrer Unterklasse. (Und das sollten Sie tun, da Sie die Unterklasse nicht benötigen.)

Drittens, Sie versuchen, ein Fenster zu fragen, das noch nicht existiert für den Rahmen, den Sie verwenden werden, um es zu erstellen . loadWindow ist nil bis nach erstellen Sie etwas und speichern Sie es dort.

Viertens, weil Sie nil für seinen Rahmen fragen, erhalten Sie ein Abfallrechteck zurück. Dann erstellen Sie ein Fenster mit diesem Abfallrechteck. Es ist nicht überraschend, wenn Sie dieses Fenster auf dem Bildschirm erscheinen, erscheint es in einer zufälligen Position (wahrscheinlich außerhalb des Bildschirms) mit einer zufälligen Größe (wahrscheinlich entweder zu groß, um zu erstellen oder negativ).

Fünftens, was hältst du davon, dass das Angeben eines Fensters zum Ordnen ein anderes Fenster zur Folge hat? Wie soll es wissen, in welchem ​​Fenster man bestellen kann?

die unbestreitbare Realität Abgesehen, dass the very existence of a splash screen punishes the user for using your application, sollten Sie NSWindowController wurden mit dem Fenster zu laden und Ihr Set-up wie setBackgroundColor: und setLevel: zu tun. Und in Ihrer Timer-Methode, bei der Sie das Splash-Fenster bestellen, müssen Sie auch explizit im Hauptfenster bestellen.

0

Ich sehe nichts, was dazu führen würde, dass ein anderes Fenster in dem von Ihnen geposteten Code erscheint. Warum versuchst du nicht, dein Hauptfenster zu senden makeKeyAndOrderFront:?

Verwandte Themen