如何从单独的NIB显示工作表

时间:2011-06-21 17:21:49

标签: objective-c macos cocoa interface-builder cocoa-sheet

如何将窗口放在单独的NIB中,给它自己的NSWindowController,让它作为工作表滑出?

(这是典型的表格吗?)

我正在尝试从主窗口显示自定义工作表(从父窗口的标题栏向下滑动的窗口)。我想,我想做的是标准的,但是我找不到明确的例子或解释如何做到我想要的。

我想做什么:

  1. 我的应用代表拥有主窗口,该窗口有一个用于打开“设置”工作表的按钮。
  2. “设置”表:
    • 位于单独的NIB中。
    • 将文件所有者设置为类SettingsWindowController,它是NSWindowsController的子类
  3. 当用户点击“设置”时,我正在尝试使用Apple的[示例代码] [1]
  4. - (void)showCustomSheet: (NSWindow *)window
    // User has asked to see the custom display. Display it.
    {
        if (!settingsSheet) 
        //Check the settingsSheet instance variable to make sure the custom sheet does not already exist.
            [NSBundle loadNibNamed:@"SettingsSheet" owner: self];
            //BUT HOW DOES THIS MAKE settingsSheet NOT nil?
    
        [NSApp beginSheet: settingsSheet
                modalForWindow: window 
                modalDelegate: self 
                didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) 
                contextInfo: nil]; 
    
        // Sheet is up here.
    
        // Return processing to the event loop
    } 
    

    请原谅以下简单易懂的问题:

    • 当我致电loadNibName:owner:时,我不希望owner成为self,因为这会让我的应用委托“MyCustomSheet”的所有者 - 这就是我的{SettingsWindowsController 1}}应该是为了。但是,我不知道如何使此方法中的所有者SettingsWindowsController
    • 如果我的工作表在“启动时可见”选中,则loadNibName:owner:会立即将窗口显示为普通窗口,而不是从主窗口滑出的工作表。
    • 如果我的工作表没有选中“在启动时可见”,则beginSheet:modalForWindow:etc会导致“模态会话需要模态窗口”。我很确定这是因为我制作了Nib的所有者self(正如我已经提到的那样)。
    • 在示例代码中,我不知道名为@“SettingsSheet”的Nib如何与实例变量settingsSheet“关联” - 但它们显然相关,因为代码首先检查:if (!settingsSheet)(我已将此标记为//BUT HOW DOES THIS MAKE settingsSheet NOT nil?

    感谢您耐心阅读所有这些内容!

1 个答案:

答案 0 :(得分:10)

  1. 创建SettingsWindowController的实例,使用initWithWindowNibName:

  2. 您不希望在发布时看到它。

  3. 见1.

  4. 您的实例变量可用于SettingsWindowController