繁体   English   中英

在没有关键窗口状态的NSPanel第一响应者中创建NSView

[英]Make NSView in NSPanel first responder without key window status

是否可以在NSPanel第一响应者状态内提供NSView而不提供NSPanel密钥窗口状态(使主应用程序窗口重新签名)?

谢谢。

好吧,我最终搞清楚了这一点,但是我花了很多研究所以我会在这里发布详细信息以防其他人遇到同样的问题。 首先,一些基础知识:

  1. 实际上两个窗口实际上同时是关键是不可能的
  2. 可以通过覆盖-isKeyWindow伪造一个窗口来认为它是关键,但这不会给窗口中包含的视图提供第一响应者状态。

我的场景:

我在主应用程序窗口中添加了一个包含NSTableView的子窗口(原因是无关紧要)。 子窗口是带有NSPanelNSBorderlessWindowMask 我想给NSTableView第一响应者状态而不使面板成为关键窗口,因为它从主窗口带走了焦点(子窗口错觉的整个点是让子窗口看起来像它是主窗口的一部分)。

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

解决方案:

所以默认情况下,NSBorderlessWindowMask不允许窗口成为键。 为了使表视图第一响应者,窗口必须是键,所以我在无边框窗口子类中覆盖canBecomeKeyWindow以返回YES 当然,这会从主窗口中取消关键状态,这是我想要避免的事情之一。 为了解决这个问题,我将窗口子类化并覆盖了以下方法:

- (BOOL)isMainWindow
{
    return YES;
}

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

此子类检查应用程序是否处于活动状态,如果是,则它始终返回YES这样无论应用程序中哪个窗口处于活动状态,主窗口将始终表现为仍然是关键。 这种方式给人一种错觉,即你可以同时拥有多个窗口,并且可以将关键窗口状态转换到另一个窗口而不会丢失它在主窗口上。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM