Cocoa文档在关闭后将无法再次打开

时间:2013-12-15 20:14:09

标签: objective-c xcode macos cocoa

这是一个非常奇怪的问题。我的Cocoa应用程序中有一个表,显示最近打开的文件列表。您可以双击条目以打开关联文件。但是,在文件打开一次之后,无论是通过“打开”面板,“最近的文档”菜单还是通过上述表格,都无法再次打开它,直到应用程序退出并重新打开。但是,其他文件可以打开,但一旦关闭,它们也无法再次打开。

这是非常奇怪的行为,我不确定是什么导致它。但它肯定很烦人。作为参考,Xcode窗口的Release on Closed属性不执行任何操作,如果选择,则不执行任何操作。我想不出任何可能导致此行为的其他属性。作为参考,这是属性面板的照片:

A photo of the document window attributes panel.

这是打开最近打开的文件的表的代码:

- (void)respondToRecentFileDoubleClick {
    NSInteger clickedRow = [_recentFileBrowser clickedRow];

    if (clickedRow != -1) { // We're in the row.
        NSDocumentController *docControl = [NSDocumentController sharedDocumentController];
        NSURL *selectedDocument = (NSURL *)[docControl recentDocumentURLs][clickedRow];
        NSLog(@"Selected row %ld.", (long)clickedRow);
        [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:selectedDocument display:YES completionHandler:nil];
    }
}

openDocumentWithContentsOfURL:的文档说如果文档已经打开就不会打开文档,但在这种情况下,所有文档窗口都会关闭,因此不能导致此行为。并打印NSLog()块中的if语句,因此我知道代码正在执行。

任何人都知道造成这个奇怪问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

从Xcode图像看,您正在使用自己的WindowController。默认的关闭菜单项连接到调用performClose。 performClose方法在NSWindow中实现。因此,正在发生的事情是窗口正在关闭,但文档未从打开的文档列表中删除。尝试添加< NSWindowDelegate>到你的WindowController接口(在.h文件中)。然后添加到WindowController .m文件:

- (void) windowWillClose:(NSNotification *)notification {
[ourdoc close];
}

替换您使用的任何变量来保存mydoc的文档参考。通常,方法setDocument将使用您的文档引用进行调用。 (也在你的WindowController中。)

 - (void) setDocument:(NSDocument *)document {
ourdoc = (yourNSDocumentsubclass *)document;
}

completionHandler:nil更改为调试:

completionHandler:^(NSDocument *doc, BOOL documentWasAlreadyOpened, NSError *error) {
    if (documentWasAlreadyOpened) {
        NSLog(@"document was already opened");
        NSArray *rats  = [[NSDocumentController sharedDocumentController] documents];
        NSLog(@"%s  seriously: %@", __PRETTY_FUNCTION__, rats);
    }
}