2013-10-10 67 views
0

我正在嘗試爲OS X構建一個基本的動態庫,它只是顯示打開文件的對話框。 我的代碼看起來是這樣的:MacOSX下奇怪的文件對話框

NSOpenPanel * dlg = [NSOpenPanel openPanel]; 
...//setting title and other properties for dlg 

dispatch_group_t group = dispatch_group_create(); 
dispatch_group_async(group, dispatch_get_main_queue(),^
{ 
    resButton = [dlg runModal]; 
}); 
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
if (resButton == NSFileHandlingPanelOKButton)//resButton is global 
{...} 

現在,雖然這基本工作,一切都有點過:

-The對話從來沒有完全初始化兩次以同樣的方式(不同的初始目錄,佈局模式。 ..)。

- 有時初始目錄顯示爲空,直到我再次選擇另一個和第一個。

- 「右鍵單擊」菜單不會顯示。

- 滾動反彈效果不起作用(!!!)。我可以無限地向下滾動,直到一切消失。

- 在列模式下,預覽不起作用(加載圖標將永遠轉動),儘管在大圖標模式下查看時,圖像具有正確的預覽。

這就像有一個整體更新線程沒有運行。它可能與調用lib的奇怪上下文相關聯:從使用JNA的Java程序中。但我希望,也許有人一個小竅門,可以解決的事情,像「只是調用[系統startUpdateTask]」什麼都知道:)

感謝所有幫助

+0

如果將所有'dispatch_'代碼替換爲塊的主體'resButton = [dlg runModal];'?畢竟... runModal是一個同步調用... – CRD

+0

@CRD沒有調度的東西,它崩潰了一個例外,其中appkit抱怨我沒有使用「線程0」 – schmop

+0

你需要從主線程調用它......不知道你爲什麼要使用調度隊列。使用performSelectorOnMainThread –

回答

1

(後評論反應:)

有些東西讓你嘗試(我無法測試你的場景)。 NSOpenPanel/NSSavePanel自引入沙盒以來,都非常微妙,需要小心處理。

需要在主線程上執行所有UI操作,就像您發現的那樣。 。然而而是採用了dispatch_*功能嘗試使用同步performSelectorOnMainThread

NSOpenPanel * dlg = [NSOpenPanel openPanel]; 
... //setting title and other properties for dlg 

resButton = [dlg performSelectorOnMainThread:@selector(runModal) 
            withObject:nil 
           waitUntilDone:YES]; 

if (resButton == NSFileHandlingPanelOKButton) //resButton is global 
{...} 

這可能解決您的問題,或不...

附錄

我的壞,因爲你正確地指出performSelectorOnMainThread不返回值。您可以改爲:

resButton作爲實例變量添加到您的類中。

添加方法:

- (void) myRunModal:(NSOpenPanel *)dlg 
{ 
    resButton = [dlg runModal]; 
} 

更改代碼:

[self performSelectorOnMainThread:@selector(myRunModal:) 
         withObject:dlg 
        waitUntilDone:YES]; 

或類似的東西。

+0

不幸的是,performSelectorOnMainThread有一個返回類型的void,並且你不能在你的示例中使用resButton = [...]。 – schmop

+0

我剛剛測試沒有分配resButton(所以我不知道用戶點擊確定或取消)...它的工作原理!也就是說,一切都正常。我想我可以使用回調或任何區分Ok和取消。非常感謝! – schmop

+0

@schmop - 道歉,我不應該直接將代碼寫入答案!添加addenudum ... – CRD