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

基本上,我希望此功能几乎像Spotlight(Apple + Space)一样工作-您可以输入文本,但这是一个辅助操作,在更大的UX上下文中,您不希望受到刺激主窗口的效果变灰(变为非事件状态)。您会注意到当您打开某些应用程序并将其聚焦时,聚光灯不会使该应用程序的窗口变为非事件状态。

出现此问题的原因是,文本输入似乎要求子窗口成为键窗口(它不允许您将光标放在文本输入字段中)。当它成为键时,主窗口将变为非事件状态。

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

  • 为我的主应用程序子类化NSWindow,并重写isKeyWindow,以便仅当该应用程序不再是用户关注的位置(而不是窗口)时,它才会丢失 key 。与子窗口的键状态发生冲突并在键盘输入上产生非常奇怪的效果(某些键未捕获,如Delete),这是意想不到的效果。
  • 创建 View 而不是窗口。由于this问题而无法使用-这些天您无法绘制Webkit WebView。

  • 有人对Cocoa/OSX向导有任何想法吗?我已经迷上了这个。我无法挠痒。

    编辑:也尝试覆盖子窗口上的以下内容。单击后,该窗口将使主应用程序窗口变为非事件状态。
    - (BOOL)canBecomeKeyWindow {
        return YES;
    }
    
    - (BOOL)canBecomeMainWindow {
        return NO;
    }
    

    编辑2:
    与NSMenu纠缠了一段时间之后,我放弃了这种方法。看来我发现了一些东西。在NSPanel中,有一个窗口样式 mask ,称为:
    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不能解决问题。没主意

    最佳答案

    您想要的是一个可以成为key window但不能成为main window的窗口。您可以自己实现这样的类,但这基本上是NSPanel的目的,因此您可以首先尝试。

    关于Cocoa/Objective-C-带有文本输入的子窗口,而主窗口不处于事件状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2940091/

    10-12 00:21
    查看更多