Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 创建或打开新文档时,如何关闭NSPanel?_Cocoa_Nsdocument_Document Architecture - Fatal编程技术网

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

Cocoa 创建或打开新文档时,如何关闭NSPanel?,cocoa,nsdocument,document-architecture,Cocoa,Nsdocument,Document Architecture,我正在开发一个基于文档的Cocoa应用程序。启动时,用户将看到一个“欢迎面板”(类型为NSPanel),其中包含用于“创建新文档”和“打开现有文档”等常见操作的按钮。这些操作分别链接到第一响应者的newDocument:和openDocument:操作,就像文件菜单中的匹配项一样 一切都按预期进行…但有三个注意事项: 创建或打开新文档时,欢迎面板不会被取消 文档窗口在创建时没有焦点 打开的文档窗口没有窗口标题栏中显示的打开文件;同样,新文档窗口也不会像预期的那样创建标题为“Untitled”、“

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

一切都按预期进行…但有三个注意事项:

  • 创建或打开新文档时,欢迎面板不会被取消
  • 文档窗口在创建时没有焦点
  • 打开的文档窗口没有窗口标题栏中显示的打开文件;同样,新文档窗口也不会像预期的那样创建标题为“Untitled”、“Untitled 2”、“Untitled 3”等的窗口。(我之所以提到这一点,不仅是因为它令人讨厌,而且因为它可能会让人了解出了什么问题。)
  • 通过让我的应用程序控制器成为欢迎面板的代表,我已经部分解决了#1。单击“打开现有文档”按钮时,面板将调整其键状态(因为文件浏览器对话框正在打开),因此我可以在代理的
    窗口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创建者没有这个问题。新窗口不是键,不是主窗口,或者两者都不是?