2011-01-08 12 views
1

ich diesen Code eingestellt habe auf meinem App-Start ausgeführt wird:NSWindow Verschwindet

NSRect rect = NSMakeRect(0, 0, 200, 50); //The location of the window 
    NSWindow *win = [[NSWindow alloc] initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 
    [win setOpaque:NO]; 

    [win setLevel:NSFloatingWindowLevel]; 
    //[win setBackgroundColor:[NSColor clearColor]]; 

    //or 

    NSView *myView = [[NSView alloc] initWithFrame: NSMakeRect(0, 0, 200, 50)]; 
    NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(10, 5, 180, 40)]; 

    [myView addSubview: myButton]; 
    [win setHidesOnDeactivate:NO]; 

    [win setContentView: myView]; 

    [win orderFront: nil]; 

Es funktioniert wie erwartet (zeigt auf eine Schaltfläche in der linken unteren Ecke des Bildschirms) etwa eine Sekunde lang, dann verschwindet . Warum verschwindet es? Speicherverwaltung oder etwas anderes, und wie behebe ich es?

Antwort

6

Erstens ist es sehr merkwürdig, eine Benutzeroberfläche zu erstellen, ohne einfach den Interface Builder zu verwenden. Kann getan werden, und es gibt eine Handvoll Gründe, dies zu tun, aber sie sind ziemlich wenige und weit dazwischen.

Als nächstes ist dieser Code an sich nicht genug, um zu sagen, was falsch gelaufen ist. Wenn Sie eine Benutzeroberfläche programmatisch erstellen, wird eine ganze Reihe von Fragen gestellt. GC oder nicht? ... wie ist Ihre Run-Schleife konfiguriert? ... haben Sie einen korrekt konfigurierten App-Wrapper?

Wie Abizem sagte, wäre die naheliegendste Vermutung, dass Sie GC aktiviert haben und das Fenster in irgendeiner globalen Variable nicht direkt oder indirekt verwurzelt sind. Es "funktioniert einfach" in einer Cocoa-Standardanwendung, da NSWindow-Instanzen über die Cocoa-Anwendungsinfrastruktur (speziell das Windows-Menü) verwurzelt sind.

+0

Ja, es war GC. Ich erstelle gerade die UI programmatisch jetzt, weil ich nicht herausfinden kann, wie man es mit IB verbindet. Ich wollte nur das schwebende Fenster funktionieren lassen, bevor ich mit neuem Code herumhantieren würde, um ein IB-Dokument zum Laden zu bekommen, anstatt eines einfachen Knopf-Fensters. –

+0

Cool - froh, dass Sie dieses Problem hinter sich haben. Ich verstehe die Logik hinter diesem Ansatz, aber ich würde Ihnen empfehlen, einen Schritt zurückzutreten und herauszufinden, wie IB zu verwenden ist. Es ist wirklich viel einfacher, als es selbst zu programmieren; Die gesamte Dokumentation, die Beispiele und der Workflow basieren auf der Verwendung von IB. In der Regel untersuchen Benutzer die Konstruktion von Nicht-IB-Oberflächen, nachdem sie IB als fortgeschrittenes Thema gemeistert haben. – bbum

4

Arbeiten Sie mit Garbage Collection?

Haben Sie eine iVar, die win festhält? Es könnte sein, dass Müll unter euch gesammelt wird.