带有NSPopover和NSTextField的NSStatusItem

时间:2012-04-16 15:46:54

标签: objective-c nstextfield nsstatusitem nspopover

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

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

  

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

感谢。

1 个答案:

答案 0 :(得分:3)

是的,只需将NSWindow + canBecomeKeyWindow(.h和.m)文件添加到您的项目中即可。我正在我正在开发的应用程序中使用这种技术,它工作正常。确保NSWindow + canBecomeKeyWindow.m列在项目的Build Phases中的“Compile Sources”下。

另外,我还有其他问题使用NSPopover来显示来自NSStatusItem的窗口。我实际上并没有尝试在我的项目中使用它,但this看起来很有希望作为替代方案。