Domanda

sto invocando un NSOpenPanel da un thread creato da spinta C ++.

i si comporta in modo irregolare del pannello e non risponde bene ai mouse, che è cliccando su oggetti non fa nulla a volte quando si fa clic sul top box livello combinata non migliorare la risposta.

faccio ho eseguire un runloop separata che sto facendo un runModalForDirectory che dovrebbe occuparsi di gestire il proprio ciclo.

Ho anche creato una classe objc separato che fa performSelectorOnMainThread mostrare pannello in thread principale, ma ancora il comportamento è lo stesso.

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

Ho anche provato con waitUntilDone:. NO e l'esecuzione di un CFRunLoopRunInMode che non sta aiutando sia

- (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;
}
È stato utile?

Soluzione

NSOpenPanel fa parte di AppKit. AppKit funzioni e classi possono essere usati con sicurezza solo sul thread principale.

Mostraci il codice è stato utilizzato con performSelectorOnMainThread in modo che possiamo aiutare a capire il motivo per cui si potrebbe ancora essere problemi a vedere. Ho il sospetto che si sta chiamando i metodi individuali con esso - do not; non funzionerà nel modo previsto. Chiamata al thread principale per la totalità della vostra interazione con NSOpenPanel.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top