it-swarm.com.de

Wie erstelle ich programmgesteuert ein Cocoa-Fenster?

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

Dies ist mein bisheriger arbeitsfreier 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];
62
Steve McLeod

Das Problem ist, dass Sie display nicht aufrufen möchten. Sie möchten entweder makeKeyAndOrderFront oder orderFront aufrufen, je nachdem, ob das Fenster das Schlüsselfenster werden soll oder nicht . Sie sollten wahrscheinlich auch NSBackingStoreBuffered verwenden.

Mit diesem Code wird Ihr randloses, blaues Fenster unten links auf dem Bildschirm erstellt:

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 können den Absender für makeKeyAndOrderFront oder orderFront festlegen, was für Ihre Situation angemessen ist.

135
Jason Coco

Eine Randnotiz, wenn Sie die Anwendung programmgesteuert ohne eine Hauptspitze instanziieren möchten, können Sie in der Datei main.m das AppDelegate wie folgt instanziieren. Dann löschen Sie in Ihren Apps Supporting Files/YourApp.plist Hauptfederbasisdatei/MainWindow.xib diesen Eintrag. Verwenden Sie dann den Ansatz von Jason Coco, 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;
}
39
johndpope

Versuchen

[window makeKeyAndOrderFront:self]; 

anstatt von

[window display];

Ist es das, was Sie anstreben?

6
Rich Catalano

Folgendes habe ich mir ausgedacht:

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 an. Ich hoffe das ist der optimale Ansatz.

2
Steve McLeod