2008-11-24 17 views
59

Mon application Cocoa nécessite de petites fenêtres générées dynamiquement. Comment puis-je créer par programmation des fenêtres Cocoa à l'exécution?Comment créer une fenêtre Cocoa par programme?

Ceci est ma tentative de non-travail 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]; 

Répondre

125

Le problème est que vous ne voulez pas appeler affichage, vous voulez appeler soit makeKeyAndOrderFront ou orderFront selon que vous souhaitez ou non la fenêtre pour devenir la clé de la fenêtre. Vous devriez également probablement utiliser NSBackingStoreBuffered.

Ce code va créer votre marge, fenêtre bleue 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é pour votre situation.

+9

Juste curieux à la personne qui a trouvé ma réponse/si/inutile pour le rejeter ... pourquoi était-ce inutile? –

+31

Ne vous inquiétez pas pour l'abattu Jason. J'ai trouvé votre réponse utile. –

+0

Cette réponse m'a beaucoup aidé! – Eonil

2

C'est ce que je suis venu avec 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]; 

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

+3

Ne pas oublier de le libérer, et de l'affecter à une forte propriété ou de retenue (ce dernier est particulièrement important dans l'ARC: http://stackoverflow.com/q/7198562/30461). –

6

Essayez

[window makeKeyAndOrderFront:self]; 

au lieu de

[window display]; 

Est-ce ce que vous visez pour?

34

Une remarque de côté, si vous souhaitez instancier par programme l'application sans une puce principale, dans le fichier main.m/vous pouvez instancier l'AppDelegate comme ci-dessous. Puis dans vos applications Fichiers de support/YourApp.plist Fichier de base de la pointe principale/MainWindow.xib supprimer cette entrée. Utilisez ensuite 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; 
} 
+4

Wow merci. Recherché longtemps pour cette réponse. Parfait! Avec le nouveau Objective-C 3.0 mieux utiliser @autorelease {...} – Binarian

Questions connexes