0

ブースト C++ によって作成されたスレッドから NSOpenPanel を呼び出しています。

パネルが不規則に動作し、マウスにうまく反応しません。つまり、最上位のコンボ ボックスをクリックすると反応が改善されるのに、オブジェクトをクリックしても何も起こらないことがあります。

独自のループを実行する必要がある runModalForDirectory を実行しています。

メインスレッドでパネルを表示するために performSelectorOnMainThread を実行する別の objc クラスも作成しましたが、それでも動作は同じです。

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

また、waitUntilDone:NO を試してみましたが、どちらも役に立たない 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;
}
4

1 に答える 1

1

NSOpenPanelAppKit の一部です。AppKit の関数とクラスは、メイン スレッドでのみ安全に使用できます。

使用したコードを見せてくださいperformSelectorOnMainThread。問題が解決しない理由を突き止めます。それを使って個々のメソッドを呼び出しているのではないかと思いますが、そうしないでください。期待どおりには機能しません。とのやり取り全体について、メイン スレッドにコールバックしますNSOpenPanel

于 2010-12-20T21:25:25.407 に答える