NSStatusItem与NSPopover和NSTextField

问题描述:

我有一个NSStatusItem显示NSPopover包含NSTextField,但文本字段不可编辑,虽然它已如此如此在Xcode。现在这是一个已知的错误,显然有人发布了一个解决方案here。我真的需要解决这个错误。NSStatusItem与NSPopover和NSTextField

我只是引用答案在这里为了方便:

的主要问题是键盘事件的工作方式。尽管NSTextField(以及他的所有超级视图)接收键盘事件,但他没有采取任何行动。发生这种情况的原因是弹出窗口的位置存在于无法成为关键窗口的窗口中。你不能以任何方式访问该窗口,至少我不能。所以解决方案是使用一个类别覆盖我们应用程序中每个NSWindow的方法canBecomeKeyWindow。

NSWindow+canBecomeKeyWindow.h 
@interface NSWindow (canBecomeKeyWindow) 

@end 

NSWindow+canBecomeKeyWindow.m 
@implementation NSWindow (canBecomeKeyWindow) 

//This is to fix a bug with 10.7 where an NSPopover with a text field cannot be edited if its parent window won't become key 
//The pragma statements disable the corresponding warning for overriding an already-implemented method 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" 
- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 
#pragma clang diagnostic pop 

@end 

这使得酥料饼完全resposive。如果您需要另一个必须对canBecomeKeyWindow作出响应的窗口,则可以始终创建一个子类。

我真的不明白我应该做什么。我只是创建这两个文件NSWindow + canBecomeKeyWindow(.h和.m),这将做到这一点?因为它不适合我。

我不确定这个问题,但是如果我实际上使用的是显示NSPopover的NSWindow,那么这样做是否可行?我没有使用NSWindow,我怎样才能让NSTextField可编辑?

谢谢。

是的,只需将NSWindow + canBecomeKeyWindow(.h和.m)文件添加到您的项目,它应该工作。我在我正在开发的应用程序中使用这种技术,并且工作正常。确保NSWindow + canBecomeKeyWindow.m在项目构建阶段的“编译源代码”下列出。

顺便说一句,我有其他问题使用NSPopover从NSStatusItem显示窗口。我实际上没有尝试在我的项目中使用它,但this看起来很有希望作为替代方案。

+0

谢谢你的回答。我希望苹果能尽快解决这个问题。我也在寻找替代品,但我宁愿依靠苹果的代码,因为其他人未来可能不会更新他们的代码。 – iMaddin 2012-05-03 12:50:16