Frage

Ich bin ein NSOpenPanel von einem Thread Aufruf von Boost C ++ erstellt.

das Panel reagiert ungewöhnlich und reagieren nicht gut auf die Maus, die an den Objekten nichts tut irgendwann klickt, wenn auf oberster Ebene Kombinationsfeld klicken Reaktion nicht verbessert.

tun Ich habe einen separaten Runloop laufen ich ein runModalForDirectory mache, die darauf achten, sollte seine eigene Schleife ausgeführt wird.

Ich habe auch eine separate objc Klasse geschaffen, die performSelectorOnMainThread hat in der Haupt Thread zu zeigen, aber immer noch das Verhalten ist gleich.

[ps performSelectorOnMainThread:@selector(showOpenPanel) withObject:nil 
                      waitUntilDone:YES
                      modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

Ich habe auch versucht, mit waitUntilDone. NO und CFRunLoopRunInMode läuft, die nicht entweder hilft

- (bool) showOpenPanel
{
    NSOpenPanel *op = [NSOpenPanel openPanel];
    [op setAllowsMultipleSelection:YES];
    [op setTitle:@"Choose File"];
    [op setMessage:@"Choose file for Importing."];
    [op setFloatingPanel:true]; 
    bool result =[op runModalForDirectory:NSHomeDirectory() file:nil types:self.fileTypes];
    if (result == NSOKButton) {
        [self setSelectedFiles:[op filenames]];
        [self setLastShowResult:true];
    }
    else {
        [self setLastShowResult:false];
    }

    [self setPanelIsDone:true]; 
    return self.lastShowResult;
}
War es hilfreich?

Lösung

NSOpenPanel ist Teil AppKit. AppKit Funktionen und Klassen können nur sicher auf dem Haupt-Thread verwendet werden.

Zeigen Sie uns den Code, den Sie mit performSelectorOnMainThread verwendet, so dass wir helfen, herauszufinden, warum Sie immer noch sehen Probleme sein könnten. Ich vermute, dass Sie anrufen einzelne Methoden mit ihm - DO NOT; es wird wie erwartet nicht. Rückruf auf den Hauptthread für die Gesamtheit der Interaktion mit NSOpenPanel.

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