如何使窗口成为 Cocoa 多窗口应用程序中的活动窗口?

Posted

技术标签:

【中文标题】如何使窗口成为 Cocoa 多窗口应用程序中的活动窗口?【英文标题】:How do I make a window the active window in a Cocoa multi window app? 【发布时间】:2011-10-12 00:45:30 【问题描述】:

我有一个多窗口 Cocoa 应用程序,使用之前question 的答案中描述的技术实现。

一切正常,但是在初始窗口出现后打开的窗口显示在前面,但它们的状态不是活动的(一切都是灰色的)。我必须在它们的框架内显式单击才能使它们成为活动窗口。

到目前为止我的支票:

我试过makeKeyAndOrderFront:,但这并没有什么不同。 NIB 中的文件所有者设置为窗口对应的控制器类。 在Debugger中可以看到每个控制器的实例其实就是对应窗口的所有者。 NSThread 建议的解决方案不使window 键窗口化。 canBecomeKeyWindow 方法返回 NO,尽管窗口是 NSWindow 的一个实例。 窗口有一个标题栏并且可以调整大小。

我需要怎么做才能显示处于活动状态的后续窗口?

编辑:

我将NSWindow 子类化为SecondaryWindow 并覆盖canBecomeKeyWindow 以返回YES。我更改为 XIB 以使用新创建的 NSWindow 子类。用调试器单步执行代码,但窗口仍然没有成为关键窗口。

【问题讨论】:

canBecomeKeyWindow 是否返回 YES? 嗯.. 不,它返回 NO。我仔细检查了 XIB 文件,根据 IB,窗口是 NSWindow 的一个实例,根据文档默认实现应该返回 YES ... 【参考方案1】:

试试这个

[previousWindow orderBack];
[previousWindow resignKeyWindow];
[newWindow orderFront];
[newWindow makeKeyWindow];
如果窗口有标题栏或调整大小栏,则可以成为关键窗口。

如果您的应用程序窗口没有标题栏或调整窗口大小,那么 它不能成为关键窗口。

【讨论】:

不,那也不行……新窗口有标题栏和调整大小栏,所以那里没有显示停止器。

以上是关于如何使窗口成为 Cocoa 多窗口应用程序中的活动窗口?的主要内容,如果未能解决你的问题,请参考以下文章

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

Cocoa 多窗口拖放示例

Flutter Desktop:如何隐藏窗口(并使进程保持活动状态)?

如何在 macOS 上的 Cocoa 中显示警报弹出窗口?

如何从 Cocoa 中的窗口控制器获取当前的第一响应者?

前景与活动窗口