2008-11-24 11 views
59

Mi aplicación Cocoa necesita algunas pequeñas ventanas generadas dinámicamente. ¿Cómo puedo crear ventanas de Cocoa mediante programación en tiempo de ejecución?¿Cómo creo una ventana de Cocoa programáticamente?

Este es mi intento de no trabajar hasta ahora. No veo ningún resultado en absoluto.

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

Respuesta

125

El problema es que usted no desea llamar pantalla, al que desea llamar o bien makeKeyAndOrderFront o orderFront dependiendo de si desea o no que la ventana se convierta en la ventana clave. También debería usar NSBackingStoreBuffered.

Este código va a crear su fronteras, ventana azul en la parte inferior izquierda de la pantalla:

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. 

Puede hacer que el remitente para makeKeyAndOrderFront o orderFront lo que sea apropiado para su situación.

+9

Solo por curiosidad a la persona que encontró mi respuesta/so/inútil para votarla ... ¿por qué no fue útil? –

+31

No se preocupe por el votante a la baja Jason. Encontré tu respuesta útil. –

+0

¡Esta respuesta me ayudó mucho! – Eonil

2

Esto es lo que he llegado con mi mismo:

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

Esto muestra una ventana azul. Espero que este sea el enfoque óptimo.

+3

No se olvide de liberarla y asignarlo a una propiedad fuerte o de retención (este último es especialmente importante bajo ARC: http://stackoverflow.com/q/7198562/30461). –

6

Trate

[window makeKeyAndOrderFront:self]; 

en lugar de

[window display]; 

es eso lo que usted está apuntando?

34

Una nota al margen, si desea instanciar mediante programación la aplicación sin un plumín principal, en el archivo main.m/puede instanciar el AppDelegate como se muestra a continuación. Luego, en sus aplicaciones Supporting Files/YourApp.plist Main base archivo base/MainWindow.xib elimine esta entrada. Luego use el enfoque de Jason Coco para adjuntar la ventana en su método 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 gracias. Buscado largo para esta respuesta. ¡Perfecto! Con el nuevo Objective-C 3.0 es mejor utilizar @autorelease {...} – Binarian

Cuestiones relacionadas