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