Cocoa 创建或打开新文档时,如何关闭NSPanel?
我正在开发一个基于文档的Cocoa应用程序。启动时,用户将看到一个“欢迎面板”(类型为Cocoa 创建或打开新文档时,如何关闭NSPanel?,cocoa,nsdocument,document-architecture,Cocoa,Nsdocument,Document Architecture,我正在开发一个基于文档的Cocoa应用程序。启动时,用户将看到一个“欢迎面板”(类型为NSPanel),其中包含用于“创建新文档”和“打开现有文档”等常见操作的按钮。这些操作分别链接到第一响应者的newDocument:和openDocument:操作,就像文件菜单中的匹配项一样 一切都按预期进行…但有三个注意事项: 创建或打开新文档时,欢迎面板不会被取消 文档窗口在创建时没有焦点 打开的文档窗口没有窗口标题栏中显示的打开文件;同样,新文档窗口也不会像预期的那样创建标题为“Untitled”、“
NSPanel
),其中包含用于“创建新文档”和“打开现有文档”等常见操作的按钮。这些操作分别链接到第一响应者的newDocument:
和openDocument:
操作,就像文件菜单中的匹配项一样
一切都按预期进行…但有三个注意事项:
窗口didResignKey:
方法中关闭面板。但是,我不知道如何在创建新文档时关闭面板,因为在创建新文档时找不到发布的通知或调用的委托方法。最终,#2仍然是一个问题,因为文档窗口在创建时无法获得焦点
我只有子类
NSDocument
——我根本没有使用自定义文档或窗口控制器。我还尝试将面板更改为NSWindow
,认为NSWindow
的行为可能不同,但同样的问题也在发生。与其链接到第一响应者的默认操作,不如在窗口控制器中创建自定义操作方法,并设置按钮来触发这些操作。在您的方法中,您需要关闭欢迎窗口,然后创建一个新文档
大概是这样的:
- (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];
}
制作一个自定义文档控制器,让它知道起点面板的控制器,并在
添加文档:
中隐藏窗口,然后在删除文档:
中再次显示它(如果没有其他文档保留)
这就是我们过去所做的。该代码在下面(不同于Adium本身),因此如果您愿意,您可以借用它。其他人可能会回答这个问题,但如果您可以创建并发布一个示例应用程序来演示该问题,它将(并且总是)很有用。我会,但我认为代码本身与此无关。界面的相关部分是一个nib(因此没有代码),而应用程序利用Cocoa的文档框架来完成其工作,因此应用程序本身的代码相对较少。除了第2项:文档窗口出现时没有焦点。关于如何实现这一点有什么想法吗?请尝试在下一个事件循环中调用
-newDocument
方法:[[NSDocumentController sharedDocumentController]performSelector:@selector(newDocument:)with object:sender afterDelay:0]
在这种情况下,您可能希望尝试-openUntitledDocumentAndDisplay:error:
方法,而不是-newDocument:
。它返回一个NSDocument
对象,然后您可以通过其窗口控制器为其获取窗口。然后,您可以使用NSWindow
的-makekeyandrefront:
方法告诉窗口订购front。但是,您需要这样做似乎有点奇怪,通常这应该“正常工作”。这解决了第一个问题,但第二个问题——新的/打开的文档窗口不关注创建——仍然存在。知道是什么导致了这个问题吗?不知道。Adium Xtras创建者没有这个问题。新窗口不是键,不是主窗口,或者两者都不是?