2015-09-19 76 views
0

我需要創建一個窗口,以便它覆蓋頂部的菜單欄和底部的碼頭。所以我不得不[NSWindow setLevel:NSMainMenuWindowLevel+1](如果我只是NSMainMenuWindowLevel菜單欄右上角的一些角落項目仍然會顯示在我的窗口,所以我必須去+1)。如何使「瀏覽/保存文件爲」對話框顯示NSMainMenuWindowLevel

所以,現在的問題是,用戶右鍵單擊我的窗口(這是一個圖像的畫布圖),然後他們選擇「另存爲」,此時我彈出打開「另存爲」對話框,但它顯示在我的窗戶後面。有沒有反正像找到剛用objc打開對話框窗口並將其級別設置爲高於NSMainMenuWindowLevel+1

像反正是有讓這個面板開啓高於這個水平:

var NSSavePanel = objc_getClass('NSSavePanel'); 
var savePanel = sel_registerName('savePanel'); 
var aSavePanel = objc_msgSend(NSSavePanel, savePanel); 

var runModal = sel_registerName('runModal') 

感謝

+1

你可以試着做相反,設置畫布主窗口的水平,而當nssavepanel關閉得到它回到mainwindow + 1 – ColdSteel

+1

非常感謝@ user3351949這是一個好主意。但它的一個解決方法,我試圖避免:(因爲它看起來不漂亮:( – Noitidart

+1

我明白我只是認爲,當用戶專注於救他專注於保存...我會考慮別的 – ColdSteel

回答

1

您可以選擇推遲保存面板的level的設置,直到窗口顯示後,這是棘手。你可以做這樣的事情(在Objective-C)之前調用-runModal

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSApp modalWindow] setLevel:NSMainMenuWindowLevel+1]; 
}); 

如果您不能使用GCD,您可以使用-performSelector:withObject:afterDelay:具有0延遲。你必須使用你自己的方法的選擇器。 (因爲這需要一個標量,而不是一個對象,因爲它的參數,則不能使用@selector(setLevel:)

+0

啊謝謝你肯我試試htis出來,是'^ {}'是否意味着它的一個區塊? – Noitidart

+1

是的,這是一個塊。稍微回答一下,表明你必須在運行保存面板之前*計劃塊(或選擇器),因爲你沒有得到另一個機會 –

+0

謝謝,我將嘗試兩種方式進行學習,使用'performSelector :withObject:afterDelay'我必須要1)'objc_allocateClassPair'然後在'NSObject'中創建一個類,然後2)class_addMethod'與SELECTOR_NAME a,它們的參數什麼都沒有,然後3)'alloc'然後4)'init'得到這個類的一個實例,然後傳遞給'performSelector:withObject:afterDelay'選擇器'SELECTOR_NAME'? – Noitidart

相關問題