2009-09-22 64 views
7

我試圖將NSPanel顯示爲圖紙。我天真地做了一些沿着這些路線:如何將NSPanel顯示爲圖紙

SheetController *sheetController = [[[SheetController alloc] 
             initWithWindowNibName:@"Sheet"] autorelease]; 

[[NSApplication sharedApplication] beginSheet:sheetController.window 
           modalForWindow:self.window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
            contextInfo:nil]; 

由於某些原因,我不知道,這是行不通的。當這部分代碼被調用時,表單瞬間閃爍(因爲autorelease消息)。工作表永遠不會掛在窗口上。

如果有人能指出我在哪裏可以找到更多信息,那將非常感激。

回答

16

這聽起來像是檢查IB中面板的「Visible at Launch」框的經典案例。把它關掉。

+0

現貨!非常感謝。 – 2009-09-23 02:00:11

2

是的,您需要擁有此控制器,只要您希望它繼續運行。你不能只創建它,自動釋放它,讓它消失 - 只要你需要它,你就需要堅持下去。

+0

當拆下自動釋放消息阻止消失,現在還沒有掛在窗口面板...我真的這個困惑。 – 2009-09-22 02:36:40

+2

僅僅不自動釋放它是不夠的。這只是一個泄漏。您需要擁有自己創建的內容,並在完成後釋放它(然後*和*)。至於掛鉤控制器其控制的窗口,你必須確保你已經設置類文件的所有者,那麼您的控制器的'window'插座連接到窗口。你在IB做這兩個。 – 2009-09-22 05:22:51

1

不要忘記,如果您試圖將其作爲「模態」表單運行(即它將接管應用程序,直到用戶將其解除),則需要推送新的運行循環。

你已經做了什麼顯示了工作表,然後沒有推送一個新的循環,所以操作系統只是顯示工作表,看到沒有理由保持它運行,並因此關閉它並繼續執行下一個行:

我通常做牀單方式如下:

- (id)showPanelModalAgainstWindow: (NSWindow *)window 
{ 
    [[NSApplication sharedApplication] beginSheet: panelToShow 
       modalForWindow: window 
       modalDelegate: self 
       didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) 
       contextInfo: nil]; 

    [[NSApplication sharedApplication] runModalForWindow: panelToShow]; 
    if (m_returnCode == NSCancelButton) return nil; 
} 


- (void)sheetDidEnd:(NSWindow *)sheet 
     returnCode:(int)returnCode 
     contextInfo:(void *)contextInfo 
{ 
    UNUSED(sheet); 
    UNUSED(contextInfo); 
    m_returnCode = returnCode; 
} 

然後,在你接受和/或取消按鈕的例程:

- (IBAction)continueButtonClicked:(id)sender 
{ 
    UNUSED(sender); 
    [[NSApplication sharedApplication] stopModal]; 
    [createAccountWizardPanel orderOut: nil]; 
    [[NSApplication sharedApplication] endSheet: createAccountWizardPanel 
             returnCode: NSOKButton]; 

} 

我敢肯定有作爲這樣做的輕輕更少的代碼-Y的方式,但我還沒有看向深入它,因爲這樣一來工作完全正常迄今爲止....

有關控制器和麪板對象的生存先前的評論也相關 - 一定要準確理解什麼樣的對象,你需要什麼時候展示一個模態面板的生命週期。

+0

此方法不推薦使用:( – ColdSteel 2015-06-28 20:01:19