3

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

为方便起见,我将在这里引用答案:

主要问题是键盘事件的工作方式。虽然 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

这使得弹出框完全响应。如果您需要另一个必须对 canBecomeKeyWindow 响应 NO 的窗口,您总是可以创建一个子类。

我真的不明白我应该做什么。我是否只创建这两个文件 NSWindow+canBecomeKeyWindow (.h 和 .m) 就可以了?因为它对我不起作用。

我对此不确定,但这仅在我实际使用显示 NSPopover 的 NSWindow 时才有效吗?我没有使用 NSWindow,如何让 NSTextField 可编辑?

谢谢。

4

1 回答 1

4

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

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

于 2012-05-03T04:06:40.137 回答