如何在创建或打开新文档时关闭NSPanel?

时间:2010-05-13 14:24:45

标签: cocoa nsdocument document-architecture

我正在研究基于文档的Cocoa应用程序。在启动时,向用户呈现“欢迎面板”(类型为NSPanel),其中包含用于“创建新文档”和“打开现有文档”等常见操作的按钮。这些操作分别与第一个响应者的newDocument:openDocument:操作相关联,就像“文件”菜单中的匹配项一样。

一切都按预期工作......有三个警告:

  1. 创建或打开新文档时,欢迎面板不会被解雇。
  2. 文档窗口在创建时没有焦点。
  3. 打开文档窗口没有窗口标题栏中显示的打开文件;同样,新文档窗口不会像预期的那样使用“无标题”,“无标题2”,“无标题3”等标题创建。 (我之所以提到这不仅仅是因为它很烦人,而是因为它可能会对出现问题的方法有所了解。)
  4. 通过让我的应用程序控制器成为欢迎面板的代表,我已经部分解决了#1问题。单击“打开现有文档”按钮时,面板将重置其键状态(因为正在打开文件浏览器对话框),因此我可以在委托的windowDidResignKey:方法中关闭该面板。但是,我无法弄清楚在创建新文档时如何关闭面板,因为在创建新文档时我找不到发布的通知或调用的委托方法。最终,#2仍然是一个问题,因为文档窗口在创建时不会获得焦点。

    我只有子类NSDocument - 我根本没有使用自定义文档或窗口控制器。我还尝试将面板更改为NSWindow,认为NSWindow可能表现不同,但同样的问题正在发生。

2 个答案:

答案 0 :(得分:0)

不是链接到第一个响应者的默认操作,只需在窗口控制器中创建自定义操作方法,然后设置按钮以触发这些操作。在您的方法中,您需要关闭欢迎窗口,然后创建一个新文档。

这样的事情:

- (IBAction)createNewDocument:(id)sender
{
    //this will close the window if you're using NSWindowController
    [self close];
    [[NSDocumentController sharedDocumentController] newDocument:sender];
}

或者,如果您没有在欢迎窗口中使用NSWindowController,则可以直接向窗口发送消息:

- (IBAction)createNewDocument:(id)sender
{
    //assume you have a "window" outlet connected to your welcome window
    [window orderOut:sender];
    [[NSDocumentController sharedDocumentController] newDocument:sender];
}

答案 1 :(得分:0)

创建一个自定义文档控制器,并让它知道您的起点数控制面板的控制器,并隐藏addDocument:中的窗口并在removeDocument:中再次显示它(如果没有其他文档)。

这就是我们在Adium Xtras Creator中所做的。该代码位于a BSD license下(与Adium不同),因此您可以根据需要借用它。