是的,NSWindowController中沒有這種方便的方法。讓我解釋一下爲什麼。
iOS視圖控制器和OS X窗口控制器有所不同:在iOS中,視圖控制器可以全屏顯示或完全隱藏屏幕。就這樣。 OS X中的窗口有更多的自由度:它可以被顯示,隱藏,調整大小,最小化/恢復,被其他應用程序窗口覆蓋,全屏顯示,轉到另一個屏幕(在多監視器配置中)等。此活動NSWindow有一個委託(它自動映射到xib中的相應NSWindowController)。看看NSWindowDelegate文檔。因此,在iOS「出現」和OS X一系列操作之間沒有直接的行爲映射。但是我們可以嘗試使用最近的可能事件。
對於你的情況(做一些在窗口變得可見),我可以提供2種不同的方法。
首先,覆蓋你的NSWindowController子類showWindow
行動:
- (IBAction)showWindow:(id)sender
{
[super showWindow:sender];
// your code here
}
這樣一來,你的代碼將被調用創建的每個時間窗口/顯示在屏幕上。
或第二,使用的委託方法:
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
// notification.object is the window that changed its state.
// It's safe to use self.window instead if you don't assign one delegate to many windows
NSWindow *window = notification.object;
// check occlusion binary flag
if (window.occlusionState & NSWindowOcclusionStateVisible)
{
// your code here
}
}
這樣一來,你的代碼都會被調用時窗(或它的一部分)將變得可見。例如,如果用戶最小化窗口上的其他窗口(或將其移動到某處),則可能發生此事件。當你想暫停動畫/定時器/等隱藏窗口來保存一些CPU時,通常情況下:
這也是非常有用的方法,如果你需要在窗口上做些什麼消失(例如,啓用hidesOnDeactivate
標誌的窗口是沒有關閉並且沒有調用相應的代理方法;他們只是從屏幕中刪除而未關閉)。這種方法使我們能夠跟蹤這些情況:
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
if (self.window.occlusionState & NSWindowOcclusionStateVisible)
{
// Appear code here
}
else
{
// Disappear code here
}
}