2008-11-24 15 views
59

Moja aplikacja Cocoa potrzebuje trochę małych, dynamicznie generowanych okien. W jaki sposób mogę programowo tworzyć okna Cocoa w czasie wykonywania?Jak programowo utworzyć okno kakao?

Oto moja nierobocza próba. Nie widzę żadnego wyniku.

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

Odpowiedz

125

Problemem jest to, że nie chcesz, aby zadzwonić wyświetlacz, chcesz zadzwonić albo makeKeyAndOrderFront lub orderFront w zależności od tego, czy chcesz, aby okno, aby stać się kluczowym okno. Powinieneś także prawdopodobnie użyć NSBackingStoreBuffered.

Kod ten będzie tworzyć obramowania niebieskie okno w lewym dolnym rogu ekranu:

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. 

Można dokonać nadawcę dla makeKeyAndOrderFront lub orderFront co jest odpowiednie dla danej sytuacji.

+9

Po prostu ciekawy dla osoby, która znalazła moją odpowiedź/więc/niepomyślne, jak ją głosować ... dlaczego nie było pomocne? –

+31

Nie martw się o nieuczciwego Jasona. Twoja odpowiedź była pomocna. –

+0

Ta odpowiedź bardzo mi pomogła! – Eonil

2

To co mam wymyślić sobie:

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

to wyświetlenie niebieskiego okna. Mam nadzieję, że jest to optymalne podejście.

+3

Nie zapomnij, aby go zwolnić, i przypisać go do silnego lub utrzymania nieruchomości (to ostatnie jest szczególnie ważne pod łuku: http://stackoverflow.com/q/7198562/30461). –

6

Spróbuj

[window makeKeyAndOrderFront:self]; 

zamiast

[window display]; 

Czy to, czego dąży do?

34

Nota boczna, jeśli chcesz programowo utworzyć aplikację bez stalówki głównej, w pliku main.m/możesz utworzyć instancję AppDelegate jak poniżej. Następnie w swoich aplikacjach Supporting Files/YourApp.plist Plik podstawowy głównego grilla/MainWindow.xib usuwa ten wpis. Następnie użyj podejścia Jason Coco, aby dołączyć okno do metody 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 thanks. Szukano długo tej odpowiedzi. Idealny! Z nowym Objective-C 3.0 lepiej używać @autorelease {...} – Binarian

Powiązane problemy