9

我如何将一个窗口放在一个单独的 NIB 中,给它自己的 NSWindowController,让它像一张纸一样滑出?

(这是与床单有关的典型事情吗?)

我正在尝试从我的主窗口显示一个自定义工作表(一个从父窗口的标题栏向下滑动的窗口)。我认为我正在尝试做的是标准的,但我找不到明确的例子或解释来说明如何完全按照我的意愿去做。

我正在尝试做的事情:

  1. 我的应用程序委托拥有主窗口,该窗口有一个打开“设置”表的按钮。
  2. “设置”表:
    • 位于单独的 NIB 中。
    • 将文件所有者设置为类 SettingsWindowController,它是 NSWindowsController 的子类
  3. 当用户单击“设置”时,我正在尝试使用 Apple 的 [示例代码][1]
- (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应该做的。但是,我不知道如何SettingsWindowsController用这种方法制作所有者。
  • 如果我的工作表选中了“启动时可见”,则loadNibName:owner:立即将该窗口显示为普通窗口,而不是从主窗口滑出的工作表。
  • 如果我的工作表未选中“启动时可见”,则会beginSheet:modalForWindow:etc导致“模态会话需要模态窗口”。我很确定这是因为我做了笔尖的所有者self(正如我已经提到的)。
  • 在示例代码中,我不知道名为 @"SettingsSheet" 的 Nib 是如何与实例变量“关联”的settingsSheet——但它们显然相关的,因为代码首先检查:(if (!settingsSheet)我用注释标记了这个//BUT HOW DOES THIS MAKE settingsSheet NOT nil?

感谢您耐心阅读这一切!

4

1 回答 1

10
  1. 创建一个实例SettingsWindowController,使用initWithWindowNibName:

  2. 您不希望它在启动时可见。

  3. 见 1。

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

于 2011-06-21T20:12:40.033 回答