我正在研究基于文档的Cocoa应用程序。在启动时,向用户呈现“欢迎面板”(类型为NSPanel
),其中包含用于“创建新文档”和“打开现有文档”等常见操作的按钮。这些操作分别与第一个响应者的newDocument:
和openDocument:
操作相关联,就像“文件”菜单中的匹配项一样。
一切都按预期工作......有三个警告:
通过让我的应用程序控制器成为欢迎面板的代表,我已经部分解决了#1问题。单击“打开现有文档”按钮时,面板将重置其键状态(因为正在打开文件浏览器对话框),因此我可以在委托的windowDidResignKey:
方法中关闭该面板。但是,我无法弄清楚在创建新文档时如何关闭面板,因为在创建新文档时我找不到发布的通知或调用的委托方法。最终,#2仍然是一个问题,因为文档窗口在创建时不会获得焦点。
我只有子类NSDocument
- 我根本没有使用自定义文档或窗口控制器。我还尝试将面板更改为NSWindow
,认为NSWindow
可能表现不同,但同样的问题正在发生。
答案 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不同),因此您可以根据需要借用它。