2010-08-26 43 views
13

OK,這是真的絆倒了我:的NSApplication襯頁:無影響

我創建了一個窗口一個模式板作爲

-(IBAction) login: (id) sender { 
[NSApp beginSheet:loginWindow 
    modalForWindow:window 
    modalDelegate:nil 
    didEndSelector:nil 
     contextInfo:nil]; 
} 

,並嘗試以刪除它

-(IBAction) loginWindowCancelPressed: (id) sender { 
debugLog(@"cancel"); 
[NSApp endSheet:loginWindow]; 
} 

但它仍然存在。

我已經檢查了所有IB連接等明顯的東西,並確保窗口和loginWindow存在並處於正常狀態。

所以,問題是:我錯過了什麼?

回答

19

您必須爲工作表設置一個委託。該代表應實現與類似下面的簽名的方法:

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; 

(你可以,如果你喜歡使用不同的名字,但它應該接受相同的參數。)

你可以做任何你需要但最終它應該結束於:

[sheet orderOut:self]; 

將會關閉工作表。

+0

就這樣。謝謝! – tomwhipple 2010-08-26 15:13:41

+2

你實際上並不需要一個委託(它是可選的)。唯一缺少的是調用orderOut: – Nik 2012-01-08 02:46:14

+1

我已經設置了一個委託和選擇器。該表由窗口控制器控制。調用endSheet:不起作用(代理從未被通知)。調用stopModal可以工作,但這是錯誤的,並且在顯示更多工作表時會導致問題。 WTF?可可桌面真的很糟糕。 90%的時間花在處理這些特質... – 2012-04-16 14:13:40

3

請參見:不需要Creating a Modal Dialog or Window in Cocoa Objective-c?

的委託。以下作品讓我解僱,並允許稍後回撥:

[NSApp endSheet: loginWindow]; 
[loginWindow orderOut:self]; 
+0

爲了簡單起見,這是一個有用的解決方案。同樣適用於OSX的新故事板系統。 – 2016-04-04 16:57:15