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

Posted

技术标签:

【中文标题】Cocoa/Objective-C - 带有文本输入的子窗口,而主窗口没有变为非活动状态【英文标题】:Cocoa/Objective-C - Child window with text input without main window becoming inactive 【发布时间】:2011-02-25 18:34:32 【问题描述】:

我需要在可可应用程序中生成一个悬停在我的主窗口上方的窗口。我希望这个主窗口允许用户在输入框中输入一些文本。一切都很好,直到文本输入框真正获得焦点。主窗口变为“停用”。这个窗口是无边界的,并且是一个稍微自定义的形状——我想它更像是一张悬停卡片。

基本上,我希望这个东西几乎可以像 Spotlight(Apple + Space)一样工作——你可以输入文本,但这是一个辅助操作,在更大的 UX 环境中,你不需要希望主窗口的不和谐效果变灰(变为非活动状态)。您会注意到,当您打开某个应用程序并处于焦点位置时,聚光灯不会导致该应用程序的窗口变为非活动状态。

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

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

为我的主应用程序子类化 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 没有做到这一点。没有想法。

【问题讨论】:

您找到解决方案了吗?抱歉,本可以通过电子邮件与您联系,但您的网站似乎已关闭。 【参考方案1】:

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

【讨论】:

也试过了。让我看看我是否无法挖掘代码。我不记得问题是否在于当我覆盖 -canBecomeMain 以返回 NO 时,它似乎没有任何区别,或者我无法输入文本。 另外,尝试了 NSPanel,没有这样的运气。再次,让我看看我是否无法挖掘代码。必须备份/报废以进行代码审查/签入 挖掘代码后,添加到我尝试过的内容中。它允许使用 -canBecomeMain 返回 NO 的文本输入,但它仍然只是使主窗口处于非活动状态。它是子窗口中的 webkit 视图......我想知道 webview 是不是又一次在这里扔屎了。【参考方案2】:

我认为这可以帮助您: [self.childWindow makeKeyAndOrderFront:self];

【讨论】:

以上是关于Cocoa/Objective-C - 带有文本输入的子窗口,而主窗口没有变为非活动状态的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa/Objective-C 和分布式对象的例子?

iPhone 上 SQLite 的最佳 Cocoa/Objective-C 包装器库 [关闭]

在 Cocoa/Objective-C 中请求热键

你可以使用 CruiseControl 来构建 Cocoa/Objective-C 项目吗?

Objective-C Runtime

使用 Cocoa 应用程序中嵌入的 AppleScript-ObjC 处理错误的最佳方法?