如何在基于Cocoa文档的应用程序中关闭文档?

时间:2011-03-13 10:14:23

标签: cocoa document

我正在使用Cocoa API为Mac创建一个简单的文本编辑器,一切正常。唯一的问题是始终禁用“关闭”菜单项。我应该在文档控制器中实现一些委托方法吗?谁已经遇到过这个问题?

2 个答案:

答案 0 :(得分:0)

关闭菜单项是否有可能不将-performClose:方法发送到“First Responder”对象(最终成为NSWindow)?我过去已经注意到,如果菜单项没有针对其操作的目标,它们会显示为灰色。

答案 1 :(得分:0)

我终于明白了。问题是基于文档的应用程序的每个窗口都是无边界的,我最近读到无边界窗口无法通过菜单项(或Cmd-W键)发送给firstResponder的performClose:方法关闭。所以我必须在窗口的子类中实现一些额外的方法:

- (void)performClose:(id)sender {
    [documentClass canCloseDocumentWithDelegate:self shouldCloseSelector:@selector(document:shouldClose:contextInfo:) contextInfo:NULL];
}

- (void)document:(NSDocument*)doc shouldClose:(BOOL)shouldClose contextInfo:(void*)contextInfo {
    if (shouldClose)
        [doc close];
}

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    return ([menuItem action]==@selector(performClose:))?YES:[super validateMenuItem:menuItem];
}

- (BOOL)canBecomeMainWindow {
    return YES;
}

- (BOOL)canBecomeKeyWindow {
    return YES;
}

最后两种方法确保窗口可以获得焦点,并且可以执行其他一些功能(如textview的Find命令)。