web-dev-qa-db-fra.com

Comment créer une fenêtre Cocoa par programmation?

Mon application Cocoa a besoin de quelques petites fenêtres générées dynamiquement. Comment créer par programmation des fenêtres Cocoa au moment de l'exécution?

C'est ma tentative qui n'a pas fonctionné jusqu'à présent. Je ne vois aucun résultat.

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

Le problème est que vous ne voulez pas appeler display, vous voulez appeler makeKeyAndOrderFront ou orderFront selon que vous voulez ou non que la fenêtre devienne la fenêtre clé . Vous devriez aussi probablement utiliser NSBackingStoreBuffered.

Ce code créera votre fenêtre bleue sans bordure en bas à gauche de l'écran:

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.

Vous pouvez faire l'expéditeur pour makeKeyAndOrderFront ou orderFront tout ce qui est approprié à votre situation.

135
Jason Coco

Une remarque, si vous souhaitez instancier l'application par programmation sans plume principale, dans le fichier main.m/vous pouvez instancier l'AppDelegate comme ci-dessous. Ensuite, dans vos applications Supporting Files/YourApp.plist Main nib base file/MainWindow.xib supprimez cette entrée. Ensuite, utilisez l'approche de Jason Coco pour attacher la fenêtre dans votre méthode init AppDelegates.

#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

Essayer

[window makeKeyAndOrderFront:self]; 

au lieu de

[window display];

C'est ce que vous visez?

6
Rich Catalano

Voici ce que j'ai trouvé moi-même:

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

Cela affiche une fenêtre bleue. J'espère que c'est l'approche optimale.

2
Steve McLeod