这是一个非常奇怪的问题。我的Cocoa应用程序中有一个表,显示最近打开的文件列表。您可以双击条目以打开关联文件。但是,在文件打开一次之后,无论是通过“打开”面板,“最近的文档”菜单还是通过上述表格,都无法再次打开它,直到应用程序退出并重新打开。但是,其他文件可以打开,但一旦关闭,它们也无法再次打开。
这是非常奇怪的行为,我不确定是什么导致它。但它肯定很烦人。作为参考,Xcode窗口的Release on Closed
属性不执行任何操作,如果选择,则不执行任何操作。我想不出任何可能导致此行为的其他属性。作为参考,这是属性面板的照片:
这是打开最近打开的文件的表的代码:
- (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
语句,因此我知道代码正在执行。
任何人都知道造成这个奇怪问题的原因是什么?
答案 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);
}
}