2014-06-06 62 views
8

我開發的MacOS X上的應用程序與Xcode5.1viewWillAppear中或viewDidAppear上NSWindowController

,並有用戶打開或顯示NSWindowController 所能找到的

    一個動作我想每次觸發
  • windowDidLoad
  • windowWillLoad
  • awakeFromNib

但沒有像iOS中:我的方法...

  • viewWillAppear中
  • viewDidAppear

因爲即使我關閉一個NSWindowController與

[NSWindowController接近]

如果我再次打開它,它不會觸發從windowDidLoad,windowDidAppear或awakeFromNib

我的行動

,現在我需要的東西和他們一樣,什麼是等價的,它必須有一些提前

感謝支持

回答

14

是的,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 
    } 
} 
相關問題