Frage

Ich verwende diesen Code:

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];

Dies ist der einzige Code in der Methode. Wenn die Methode aufgerufen wird, erscheint das offene Panel auf dem Bildschirm für eine Sekunde verschwindet dann. Wie verhindere ich das?

Danke.

War es hilfreich?

Lösung

Da die Platte nicht blockierend ist, setzt die Ausführung von Code, sobald die Platte geöffnet hat. Die offene Platte wird freigegeben, weil Sie nicht einen Verweis auf sie irgendwo zu halten. -openPanel ist ein Convenience-Konstruktor und gibt ein Autoreleased Objekt, das weggeht, wenn der aktuelle Autofreigabepool aufgetaucht ist oder (in einem GC-App), wenn der Kollektor nächster Lauf ist. In Ihrem Fall ist dies so bald wie Ihre Methode beendet ist.

Wenn Sie das Panel wollen dableiben, müssen Sie es speziell behalten -retain verwenden und dann -release anschließend in der didEndSelector:

- (void)showPanel
{
    NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; //note the retain
    [openPanel beginForDirectory:nil 
                            file:nil 
                           types:[NSImage imageFileTypes] 
                modelessDelegate:self 
                  didEndSelector:@selector(myOpenPanelDidEnd:returnCode:contextInfo:)
                     contextInfo:NULL];
}

- (void)myOpenPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void*)contextInfo
{
    NSArray* fileNames = [panel filenames];
    [panel release];
    //do something with fileNames
}

Wenn Sie Garbage Collection verwenden, behalten und Release sind No-ops, so müssen Sie stattdessen eine starke Bezugnahme auf die NSOpenPanel speichern, wie es in einer Instanzvariablen speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top