Pregunta

Estoy invocando una NSOpenPanel de un hilo creado por impulso C ++.

los paneles se comporta de forma errática y no responde bien al ratón, que está al hacer clic en los objetos no hace nada en algún momento al hacer clic en la caja combo nivel superior no mejorar la respuesta.

hago tengo que ejecutar un runloop separada que estoy haciendo un runModalForDirectory que debe hacerse cargo de ejecutar su propio bucle.

También he creado una clase objc separado que hace performSelectorOnMainThread para mostrar el panel en el hilo principal pero aún así el comportamiento es el mismo.

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

También he probado con waitUntilDone:. NO y la ejecución de un CFRunLoopRunInMode el cual tampoco está ayudando

- (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;
}
¿Fue útil?

Solución

NSOpenPanel es parte de AppKit. AppKit funciones y clases sólo se pueden utilizar de forma segura en el hilo principal.

Muéstranos el código que utilizó con performSelectorOnMainThread para que podamos ayudar a entender por qué es posible que aún haber problemas para ver. Sospecho que está llamando métodos individuales con ella - no; no va a funcionar de la forma esperada. volver llamada al hilo principal para la totalidad de su interacción con NSOpenPanel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top