Вопрос

Я вызываю NsopenPanel из потока, созданной Boost C ++.

Панель ведет себя беспорядочно и не очень хорошо реагирует на мышь, которая нажимает на объекты, когда -то ничего не делает, когда нажатие на комбо -поле на верхнем уровне улучшает ответ.

Я запускаю отдельный Runloop, я занимаюсь Runmodalfordirectory, который должен позаботиться о своем собственном цикле.

Я также создал отдельный класс OBJC, который выполняет SelectorOnmainthread, чтобы показать панель в главном потоке, но поведение все же.

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

Я также попробовал с Waithuntildone: нет и управлять cfrunloopruninmode, который тоже не помогает.

- (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;
}
Это было полезно?

Решение

NSOpenPanel является частью Appkit. Функции Appkit и классы могут быть безопасно использованы только в основном потоке.

Покажите нам код, с которым вы использовали performSelectorOnMainThread Таким образом, мы можем помочь выяснить, почему вы все еще увидите проблемы. Я подозреваю, что вы называете индивидуальные методы с этим-не; Это не сработает так, как вы ожидаете. Перезвоните в основной теме для совокупности вашего взаимодействия с NSOpenPanel.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top