Cocoa / Objective-C - 没有主窗口的文本输入的子窗口变为非活动状态

时间:2010-05-30 20:05:28

标签: cocoa macos nswindow textinput spotlight

我需要在cocoa应用程序中生成一个悬浮在主窗口上方的窗口。我希望这个主窗口允许用户在输入框中输入一些文本。一切都很好,直到文本输入框实际上获得焦点。主窗口变为“停用”。这个窗口是无边框的,是一个略微自定义的形状 - 我想它更像是一个悬停卡,而不是其他任何东西。

基本上,我希望这件事能像Spotlight(Apple + Space)一样工作 - 你可以输入文字,但这是一个辅助操作,在更大的用户体验的背景下,你不希望主窗口的震动效果变暗(变为不活动状态)。您会注意到当某个应用程序打开并处于焦点时,聚光灯不会导致该应用程序的窗口变为非活动状态。

出现此问题是因为文本输入似乎要求子窗口成为关键窗口(它不会让您将光标放在文本输入字段中)。当它变为键时,主窗口变为非活动状态。

到目前为止,我已经尝试过:

  • 为我的主应用程序子类化NSWindow并覆盖isKeyWindow,这样当应用程序不再是用户关注时(而不是窗口),它只会丢失密钥。这会产生意外的影响,即与子窗口的键状态发生碰撞,并对键盘输入产生非常奇怪的影响(某些键未被捕获,如删除)
  • 创建视图而不是窗口。由于this问题不起作用 - 这些天你无法绘制Webkit WebView。

任何人Cocoa / OSX向导都有什么想法?我对这个有点痴迷。痒我不能划伤。

编辑:还尝试在子窗口上覆盖以下内容。单击时,窗口使主应用程序窗口变为非活动状态。

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow {
    return NO;
}

编辑2: 在与NSMenu搞砸一段时间后,我取消了这种方法。然而,我似乎找到了一些东西。在NSPanel中有一个名为:

的窗口样式掩码
NSNonactivatingPanelMask
The panel can receive keyboard input without activating the owning application.
Valid only for an instance of NSPanel or its subclasses; not valid for a window.

现在尝试一下......

编辑3:NSNonactivatingPanelMask没有做到这一点。没有想法。

2 个答案:

答案 0 :(得分:0)

你想要的是一个可以成为key window但不能成为main window的窗口。你可以自己实现这样一个类,但这基本上就是NSPanel的用途,所以你可以先尝试一下。

答案 1 :(得分:0)

我认为这可以帮到你:     [self.childWindow makeKeyAndOrderFront:self];