NSTextfield 不接受具有 NSTitledWindowMask 的 NSWindow 上的按键事件

NSTextfield not accepting keyevents on NSWindow which has NSTitledWindowMask

我已经开始编写 cocoa 应用程序。我用 initWithContentRect 创建了一个 NSwindow。 我创建了一个 NSTextField。我无法获得任何键盘事件。它是可选择的。我还明确地将 editable 设置为 true。 我意识到有类似的问题,但它们主要是关于响应者、键 window 和 Borderlesswindow style

我有一个 NSWindows,它有一个标题为 window 的掩码,是键 window,当我将它设置为第一响应者时它被选中。

但是为什么我不能在框中输入任何内容。

int style = NSClosableWindowMask  |NSTexturedBackgroundWindowMask | NSTitledWindowMask | NSMiniaturizableWindowMask;

window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 130, 150)
styleMask:style backing:NSBackingStoreBuffered defer:NO];

CGFloat height=20;
NSTextField  * username=[[NSTextField alloc] initWithFrame:NSMakeRect(10, NSHeight(window.frame)-80, 100, height)];
[username setEditable:true];
[window.contentView addSubview:username ];

是不是因为我需要创建NSwindow的子类。当样式为 NSBorderlessWindowMask 并通过覆盖

时,我看到这是建议的

canBecomeKeyWindow建议解决问题。

但我没有使用 NSBorderlessWindowMask

我错过了什么?任何帮助表示赞赏。

根据您的评论,您说您没有 Info.plist 文件。我猜你的应用程序甚至没有捆绑。这是一个 至关重要的 事实,但你在问题中遗漏了这一点,这只会让人们很难帮助你。

首先,您应该以正常方式创建应用程序。使用主笔尖制作捆绑应用程序。遵循标准模板,除了从主笔尖删除 window 和 use separate window NIBs.

如果您不了解 "manually" 构建的应用程序出了什么问题并修复它,那么您真的不应该走那条路。

也就是说,未捆绑的应用程序将以 background-only 进程开始运行。您看到的少量交互或多或少是一个错误。您可以通过将应用程序对象(NSApplication 或子类的实例)的 activationPolicy 设置为 NSApplicationActivationPolicyRegular,将您的应用程序转换为前台应用程序。然后,通过调用 [NSApp activateWithOptions:NSApplicationActivateIgnoringOtherApps].

使其成为活动应用程序