代码之家  ›  专栏  ›  技术社区  ›  Martin Cote

如何将nspanel显示为工作表

  •  7
  • Martin Cote  · 技术社区  · 15 年前

    我正试着把一个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 消息)。这张床单从未钩住窗户。

    如果有人能指出我在哪里能找到更多的信息,我将非常感激。

    3 回复  |  直到 11 年前
        1
  •  16
  •   Mike Abdullah    15 年前

    这听起来像是在ib中选中了面板的“启动时可见”框的经典案例。关闭它。

        2
  •  2
  •   Peter Hosey    15 年前

    是的,您需要拥有这个控制器,只要您希望它继续工作。你不能只创建它,自动释放它,让它死,你需要保持它,只要你需要它。

        3
  •  1
  •   MarcWan    15 年前

    别忘了,如果你想把它作为一个“模式”表来运行(也就是说,它会接管应用直到用户放弃它),你需要推一个新的运行循环。

    您所做的是显示工作表,然后不推动新的循环,因此操作系统只显示工作表,认为没有理由让它继续运行,因此关闭它并在下一行继续执行:

    我通常按以下方式进行工作表:

    - (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的方式来完成这项工作,但是我没有深入研究它,因为这种方式迄今为止工作得非常好……

    以前关于控制器和面板对象生存期的注释也是相关的——请确保在显示模式面板时准确了解您需要的对象的生存期。