2008-11-24 9 views
59

Meine Cocoa-App benötigt einige kleine dynamisch generierte Fenster. Wie kann ich Cocoa-Fenster zur Laufzeit programmatisch erstellen?Wie erstelle ich ein Cocoa-Fenster programmgesteuert?

Dies ist mein bisher nicht funktionierender Versuch. Ich sehe überhaupt kein Ergebnis.

NSRect frame = NSMakeRect(0, 0, 200, 200); 
NSUInteger styleMask = NSBorderlessWindowMask; 
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask]; 

NSWindow * window = [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreRetained defer:false]; 
[window setBackgroundColor:[NSColor blueColor]]; 
[window display]; 

Antwort

125

Das Problem ist, dass Sie nicht wollen, Anzeige anrufen, möchten Sie entweder makeKeyAndOrderFront oder orderFront je nach anrufen, ob Sie das Fenster soll der Schlüssel Fenster werden. Sie sollten wahrscheinlich auch NSBackingStoreBuffered verwenden.

Dieser Code wird Ihre randlos, blau Fenster unten links auf dem Bildschirm erstellen:

NSRect frame = NSMakeRect(0, 0, 200, 200); 
NSWindow* window = [[[NSWindow alloc] initWithContentRect:frame 
        styleMask:NSBorderlessWindowMask 
        backing:NSBackingStoreBuffered 
        defer:NO] autorelease]; 
[window setBackgroundColor:[NSColor blueColor]]; 
[window makeKeyAndOrderFront:NSApp]; 

//Don't forget to assign window to a strong/retaining property! 
//Under ARC, not doing so will cause it to disappear immediately; 
// without ARC, the window will be leaked. 

Sie den Absender für makeKeyAndOrderFront oder orderFront, was für Ihre Situation geeignet ist machen.

+9

Nur neugierig auf die Person, die meine Antwort gefunden/so/nicht hilfreich, um sie zu stimmen ... warum war es nicht hilfreich? –

+31

Mach dir keine Sorgen über den down-voter Jason. Ich fand deine Antwort hilfreich. –

+0

Diese Antwort hat mir sehr geholfen! – Eonil

2

Dies ist, was ich mit mir selbst habe kommen:

NSRect frame = NSMakeRect(100, 100, 200, 200); 
NSUInteger styleMask = NSBorderlessWindowMask; 
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask]; 
NSWindow * window = [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreBuffered defer:false]; 
[window setBackgroundColor:[NSColor blueColor]]; 
[window makeKeyAndOrderFront: window]; 

Dies zeigt ein blaues Fenster. Ich hoffe, das ist der optimale Ansatz.

+3

Vergessen Sie nicht, um sie zu lösen, und es zu einer starken oder Halte Eigenschaft zuweisen (letzteres unter ARC besonders wichtig ist: http://stackoverflow.com/q/7198562/30461). –

6

Versuchen

[window makeKeyAndOrderFront:self]; 

statt

[window display]; 

Ist das, was Sie sind mit dem Ziel?

34

Eine Randnotiz, wenn Sie die Anwendung ohne eine Hauptspitze in der Datei main.m programmatisch instantiieren möchten, können Sie das AppDelegate wie folgt instanziieren. Dann in Ihren Apps Supporting Files/YourApp.plist Main Nib Basisdatei/MainWindow.xib löschen Sie diesen Eintrag. Verwenden Sie dann Jason Cocos Ansatz, um das Fenster in Ihrer AppDelegates-Init-Methode anzuhängen.

#import "AppDelegate.h": 

int main(int argc, char *argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    [NSApplication sharedApplication]; 

    AppDelegate *appDelegate = [[AppDelegate alloc] init]; 
    [NSApp setDelegate:appDelegate]; 
    [NSApp run]; 
    [pool release]; 
    return 0; 
} 
+4

Wow danke. Lange nach dieser Antwort gesucht. Perfekt! Mit dem neuen Objective-C 3.0 besser @autorelease {...} verwenden – Binarian