gpt4 book ai didi

cocoa - 使NSPanel中的NSView成为无关键窗口状态的第一响应者

转载 作者:行者123 更新时间:2023-12-03 16:10:37 24 4
gpt4 key购买 nike

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

谢谢。

最佳答案

好吧,我最终解决了这个问题,但需要进行大量研究,因此我将在此处发布详细信息,以防其他人遇到同样的问题。首先,一些基础知识:

  1. 实际上不可能同时有 2 个窗口
  2. 可以通过覆盖 -isKeyWindow 来假装窗口认为它是关键,但这不会赋予窗口中包含的 View 第一响应者状态。

我的场景:

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

我尝试的第一件事是通过覆盖 isKeyWindow 返回 YES 来欺骗 TableView ,使其认为它位于关键窗口内。这使得 TableView 绘制得好像它是第一响应者一样,但仍然没有给它第一响应者状态。

解决方案:

所以默认情况下,NSBorderlessWindowMask 不会允许窗口成为关键。为了使 TableView 成为第一响应者,窗口必须是关键,因此我重写了无边框窗口子类中的 canBecomeKeyWindow 以返回 YES。当然,这剥夺了主窗口的关键状态,这是我想避免的事情之一。为了解决这个问题,我对我的窗口进行了子类化并覆盖了以下方法:

- (BOOL)isMainWindow
{
return YES;
}

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

这个子类检查应用程序是否处于事件状态,如果是,它总是返回YES,这样无论应用程序中哪个窗口处于事件状态,主窗口的行为总是就像它是事件的一样仍然是关键。这种方式给人一种错觉,即您可以同时让多个窗口成为关键,并使您能够将关键窗口状态转移到另一个窗口,而不会在主窗口上丢失它。希望这有帮助!

关于cocoa - 使NSPanel中的NSView成为无关键窗口状态的第一响应者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4916100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com