2009-09-22 60 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