即使设置了“可编辑”行为,也无法在NSPopover上编辑NSTextField

我有一个应用程序,打开与NSTextField 。 文本字段不可编辑。 文本字段的行为设置为Editable 。 我仍然可以粘贴和复制文本到这个领域,但我不能编辑它。

任何人都知道,有什么可能是错的?

不知道你是否仍然需要这个答案,但可能还有其他人在寻找。 我在苹果开发者论坛上find了一个解决scheme。 引用原作者:

主要的问题是键盘事件的工作方式。 尽pipeNSTextField(及其所有超级视图)接收键盘事件,但它不会执行任何操作。 发生这种情况的原因是popup窗口的视图位于不能成为关键窗口的窗口中。 您无法以任何方式访问该窗口,至less我不能。 所以解决scheme是在我们的应用程序中使用一个类别覆盖每个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 

这使得popover充分resposive。 如果您需要另一个必须对canBecomeKeyWindow返回NO的窗口,则可以始终创build一个子类。

我也一直在努力,直到我意识到这是一个错误。

但是,我们不是依赖NSStatusItem视图的isActive状态,而是使用已实现的NSPopover的isShown属性更可靠。

在我的代码中,我在NSViewController中有一个NSPopover:

  - (BOOL)canBecomeKeyWindow { if([self class]==NSClassFromString(@"NSStatusBarWindow")) { NSPopover *mainPopover = [[((AppDelegate*)[NSApp delegate]) mainViewController] mainPopover]; if(![mainPopover isShown]) return NO; } return YES; } 

Balazs Toth的答案是有效的,但是如果你将popup窗口附加到NSStatusItem.view,那么状态项变得没有反应 – 需要点击两次才能关注。

我使用这个解决scheme时发现的是,当NSStatusItem变得没有响应时,你可以很容易地重写这个行为

 - (BOOL)canBecomeKeyWindow { if([self class]==NSClassFromString(@"NSStatusBarWindow")) { CBStatusBarView* view = [((CBAppDelegate*)[NSApp delegate]) statusItemView]; if(![view isActive]) return NO; } return YES; } 

你将检查窗口的类,如果它匹配NSStatusBarWindow,我们可以检查NSStatusItem是否处于活动状态。 如果是这样,那意味着我们必须返回YES,因为这样NSStatusItem中NSPopover就会有所有的键盘事件。

我用来检查是否NSStatusItem被点击(或是活动)是在我自己的自定义视图中,我有一个布尔值,当用户点击NSStatusItem时 ,系统会自动检查“canBecomeKeyWindow” ,当它做到这一点将返回NO ,当用户点击它(当它返回NO时 ),它会改变布尔值,并在系统再次询问时返回YES (当单击NSPopover进行NSTextField编辑时)。

Sidenotes

  • CBStatusBarView是我的NSStatusItem自定义视图
  • CBAppDelegate是我的应用程序委托类

绝对是一个错误。 这个错误报告正是我想要做的。 甚至到创build状态项目和重写压缩。

我可以证实巴拉斯·托特的答案是有效的。 我只是想知道它是否会在路上走下坡路。