2009-10-14 42 views
1

這是this question的後續行動。我有以下代碼:如何使主窗口在可可中可見?

- (BOOL)applicationShouldHandleReopen:(NSApplication *)app hasVisibleWindows:(BOOL)flag { 
    NSLog(@"Has visible windows: %d, main window visible: %d", flag, [[app mainWindow] isVisible]); 
    if (!flag) { 
     // I need to make mainWindow visible again here. HOW??? 
     // I tried the following but it has no effect. 
     // [[app mainWindow] makeKeyAndOrderFront:self]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 

有[窗口ISVISIBLE]消息,我可以用它來查詢,但沒有相應的調用setVisible或「秀」 ......

回答

8

首先,Cocoa中的「主窗口」並不意味着我認爲你認爲它的意思。 The 「main window」 is the window that is active。如果您沒有訂購任何窗口,則沒有窗口是主窗口,並且mainWindow將返回nil;如果一個窗口處於活動狀態,它就是主窗口,但它不是一個被排除的窗口(如果是的話,它不能被激活)。

所以,你需要創建一個出口到窗口考慮主窗口。

isVisible會告訴你,窗是否有序。如果它勒令退出(isVisible回報NO),你會想它訂購。

當然,你不能只是爲了它,因爲那不會指定你想要它的順序。所以,你想要訂購它正面

但是,如果它沒有用戶焦點 - 也就是說,如果它不是,使它成爲最前面的窗口並不算太多。所以,你想讓它的關鍵在之前。

您要發送的消息是makeKeyAndOrderFront:。把它作爲關鍵也將使其成爲主要。

+0

謝謝,這很有幫助。是的,看起來我期待從「主窗口」多一點,並認爲它更特別。 我想我很困惑,因爲我正在看我的NIB文件,並且看到Application和Window並排。但顯然他們有不同的生命週期策略,Window並不是一個真正的持久對象。 那麼讓我問一下 - 如果我想通過我的應用程序只有一個窗口,那麼最適合做什麼?我應該在控制器中以某種方式保留對象嗎?每次調用applicationShouldHandleReopen時,是否應該從NIB重新加載它?要麼? – Jaanus

+0

是的,應用程序和窗口在Mac OS X中不是同一個東西,而且您的應用程序沒有包含所有其他應用程序的頂級窗口。是的,只要你希望它存在,你就會保留這個窗口。當你想讓它停止時,關閉它並(如果IB中相關的框未被選中)釋放它。有可能,有時候最好是多次加載同一個筆尖 - 但是這會每次給你一個筆尖中對象的新副本,這在這種情況下不是你想要的。 –

+0

謝謝...作爲一個後續,我終於通過使我的主應用程序控制器成爲NSWindowController的一個子類,並將其「窗口」出口指向所需的窗口,從而使它工作。這種方式窗口是持久的。 – Jaanus

1
[[app mainWindow] makeKeyAndOrderFront:self] 
2

假設你確實有一個主窗口存在,它只是由於某種原因訂購,請使用makeKeyAndOrderFront:。不過,我敢打賭,你沒有一個主要的窗口可以與之交談,所以你需要提出一些你可以參考的窗口或者打開一個新的窗口。

+0

這似乎沒有效果,沒有窗口出現(即一旦我關閉主窗口,無法取回它。)我不知道如何判斷主窗口是否仍然存在。 – Jaanus