如何显示NSPanel如纸(How to show a NSPanel as a sheet)

2019-08-08 15:49发布

我试图表现出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消息)。 片材被从未钩到窗口。

如果任何人都可以点我在哪里可以找到更多的信息,那将是非常赞赏。

Answer 1:

这听起来像是在检查“可见在启动”框在IB面板的经典案例。 把它们关掉。



Answer 2:

是的,你需要拥有此控制器,只要你想让它继续工作。 你不能只是创建它,自动释放它,让它死,你需要抓住它,只要你需要它。



Answer 3:

不要忘了,如果你想运行此为“莫代尔”表(即它接管应用,直到用户将其关闭),你需要推动一个新的运行循环。

你所做的是显示的工作表,然后未按一个新的循环,所以刚刚OS显示板,认为没有理由保持运行,从而将其关闭,并在下一行继续执行:

我通常做表的方式如下:

- (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的方式,但我还没有看向深入它,因为这样一来工作完全正常迄今为止....

有关控制器和面板对象的生存先前的评论也与此有关 - 一定要了解你需要的显示模式面板时什么使用寿命期到底是什么物体。



文章来源: How to show a NSPanel as a sheet