Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在NSPanel第一响应器中创建NSView,但不显示键窗口状态_Cocoa_Nsview_Nswindow_Nsresponder_Nspanel - Fatal编程技术网

Cocoa 在NSPanel第一响应器中创建NSView,但不显示键窗口状态

Cocoa 在NSPanel第一响应器中创建NSView,但不显示键窗口状态,cocoa,nsview,nswindow,nsresponder,nspanel,Cocoa,Nsview,Nswindow,Nsresponder,Nspanel,是否可以在不提供NSPanel密钥窗口状态(使主应用程序窗口退出密钥)的情况下,在NSPanel第一响应者内部提供NSView状态 谢谢。好吧,我最终弄明白了这一点,但这需要大量的研究,所以我将在这里发布详细信息,以防其他人遇到同样的问题。首先,有几个基本问题: 不可能让两个窗口同时处于关键位置 可以通过覆盖-isKeyWindow来伪装窗口,使其认为自己是键,但这不会给出窗口第一响应者状态中包含的视图 我的场景: 我在主应用程序窗口中添加了一个子窗口,其中包含一个NSTableView(原因是

是否可以在不提供NSPanel密钥窗口状态(使主应用程序窗口退出密钥)的情况下,在NSPanel第一响应者内部提供NSView状态


谢谢。

好吧,我最终弄明白了这一点,但这需要大量的研究,所以我将在这里发布详细信息,以防其他人遇到同样的问题。首先,有几个基本问题:

  • 不可能让两个窗口同时处于关键位置
  • 可以通过覆盖
    -isKeyWindow
    来伪装窗口,使其认为自己是键,但这不会给出窗口第一响应者状态中包含的视图
  • 我的场景:

    我在主应用程序窗口中添加了一个子窗口,其中包含一个
    NSTableView
    (原因是不相关的)。子窗口是一个带有
    NSBorderlessWindowMask
    NSPanel
    。我想给出
    NSTableView
    first responder状态,而不将面板设为关键窗口,因为它会将焦点从主窗口移开(而子窗口错觉的全部目的是使子窗口看起来像是主窗口的一部分)

    我尝试的第一件事是通过重写
    isKeyWindow
    返回
    YES
    来愚弄表视图,使其认为它在键窗口内。这使得表视图的绘制看起来像是第一个响应者,但仍然没有给出第一个响应者的状态

    解决方案:

    因此,默认情况下,NSBorderlessWindowMask将不允许窗口成为关键帧。要使表视图成为第一个响应者,窗口必须是键,因此我在无边界窗口子类中重写了
    canBecomeKeyWindow
    ,以返回
    YES
    。当然,这会从主窗口中删除密钥状态,这是我想要避免的事情之一。为了解决这个问题,我对我的main窗口进行了子类化,并覆盖了以下方法:

    - (BOOL)isMainWindow
    {
        return YES;
    }
    
    - (BOOL)isKeyWindow
    {
        return ([NSApp isActive]) ? YES : [super isKeyWindow];
    }
    

    该子类检查应用程序是否处于活动状态,如果处于活动状态,则始终返回
    YES
    ,这样无论应用程序中哪个窗口处于活动状态,主窗口的行为都将始终如同它仍然是键一样。这样会产生一种错觉,即您可以同时使用多个窗口作为关键点,并使您能够将关键点窗口状态切换到另一个窗口,而不会在主窗口上丢失它。希望这有帮助

    真棒的回答。拯救了我的早晨。谢谢使用10.8这个解决方案是否可能不再有效?@PeterHosey:即使我覆盖isKeyWindow以始终返回“是”,当我点击面板时,主窗口也将被禁用。所以我无法重现“假造一扇窗户,让人以为它是钥匙”的可能性。在保持主窗口处于激活状态时,我无法从另一个窗口键进行查看。我是通过努力实现这一目标而发现的