2012-12-04 52 views
4

我想在用戶單擊NSWindowController中的紅色關閉按鈕時停止模式。如何使用NSWindowController中的關閉按鈕停止模式?

在NSWindowController中,有「確定」和「取消」按鈕。

- (IBAction)okButtonClicked:(id)sender 
{ 
    [NSApp stopModalWithCode:NSOKButton]; 
    [self.window close]; 
} 

- (IBAction)cancelButtonClicked:(id)sender 
{ 
    [NSApp stopModalWithCode:NSCancelButton]; 
    [self.window close]; 
} 

而當我點擊紅色的關閉按鈕,窗口將關閉,模式不會停止。 我找到了windowWillClose:函數。

- (void)windowWillClose:(NSNotification *)notification 
{ 
    if ([NSApp modalWindow] == self.window) 
     [NSApp stopModal]; 
} 

然而,

if ([NSApp runModalForWindow:myWindowController.window] != NSOKButton) 
    return; 

即使我點擊確定按鈕,windowWillClose:函數被調用,runModalForWindow:函數總是返回NSCancelButton。

作爲模態的結果,我可以將成員變量添加到myWindowController中。

但我認爲會有另一種通用的方式來解決這個問題。

我想採取一個簡單的方法。

回答

2

你可以嘗試這樣的

- (IBAction)okButtonClicked:(id)sender 
{ 
    [NSApp stopModalWithCode:NSOKButton]; 
    [NSApp endSheet:self.window]; 
} 

- (IBAction)cancelButtonClicked:(id)sender 
{ 
    [NSApp stopModalWithCode:NSCancelButton]; 
    [NSApp endSheet:self.window]; 
} 
+0

我想在用戶點擊NSWindowController中的紅色關閉按鈕時停止模式。 – Yun

+0

你可以試試這個方法: - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {AppDelegate – NewStack

3

也許這是一個有點晚,但我發現,試圖找到答案了自己這個問題。這就是官方文檔中所說的:當您通過[window close]關閉窗口時,不會調用- (BOOL)windowShouldClose:(id)sender事件處理程序。只有在使用紅色關閉按鈕或[window performClose:]選擇器時纔會調用它。因此解決方案是在您的NSWindowController子類中實現windowShouldClose:而不是windowWillClose:

0

根據 NSapplication Class Reference endSheet:NSApplication上的方法將在10.10(Mavericks)中不推薦使用。蘋果公司建議使用NSWindow beginSheet:和襯頁:方法,所以,如果你想從你的NSWindowController子內解僱你NSWindowController你應該使用這個代碼片斷

[self.window.sheetParent endSheet:self.window]; 

它使用NSWindow的sheetParent屬性調用endSheet:並傳遞你的子類的窗口作爲參數。你也可以使用NSWindow的endSheet:returnCode:如果你想指定返回碼。測試OSX 10.9/XCode 6.1.1

相關問題