1

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

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

  1. 创建或打开新文档时,欢迎面板不会关闭。
  2. 文档窗口在创建时没有焦点。
  3. 打开的文档窗口没有窗口标题栏中显示的打开文件;同样,不会像预期的那样创建带有“Untitled”、“Untitled 2”、“Untitled 3”等标题的新文档窗口。(我提到这一点不仅是因为它很烦人,而且因为它可能会产生一些对出了什么问题的洞察力。)

通过使我的应用程序控制器成为欢迎面板的代表,我已经部分解决了 #1。单击“打开现有文档”按钮时,面板将退出其键状态(因为正在打开文件浏览器对话框),因此我可以在委托的windowDidResignKey:方法中关闭面板。但是,我不知道在创建新文档时如何关闭面板,因为在创建新文档时找不到发布的通知或调用的委托方法。最终,#2 仍然是一个问题,因为文档窗口在创建时没有获得焦点。

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

4

2 回答 2

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];
}
于 2010-05-14T00:22:06.623 回答
0

制作一个自定义文档控制器,让它知道您的起点面板的控制器,然后将窗口隐藏addDocument:removeDocument:.

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

于 2010-05-14T09:29:20.087 回答