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]
.
使其成为活动应用程序
我已经开始编写 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]
.