NSWindow级别和模态对话框

时间:2013-12-03 15:17:32

标签: objective-c macos cocoa

我有一个应用程序需要在其他任何地方显示一个窗口。要实现这一点,我在主窗口上调用[window setLevel:NSStatusWindowLevel]

除了我不能使用此窗口中的任何模态对话框或警报外,此方法正常。问题似乎是[NSWindow beginSheet...]内部调用目标模态窗口上的setLevel:,其值低于NSStatusWindowLevel,因此模式对话框显示在后面其父级窗口。从窗口级别较高的窗口使用NSAlert时会出现同样的情况,警报显示在后面。

我找到的唯一[丑陋]解决方法是继承NSWindow,覆盖setLevel:并阻止在这些模态窗口上设置较低级别值,但这仅在我控制窗口并且不起作用时才有效NSAlerts。

是否有一个更优雅的解决方案,用于显示具有高窗口值的NSWindow的模态对话框,这也适用于NSAlerts?或者我将无法使用NSAlert这种方法?

1 个答案:

答案 0 :(得分:2)

我想到的一件事是检查NSAlert是否使用了一个特殊的NSWindow子类,您可以在其上创建一个类别,并通过混合(here is an example挂钩setLevel:方法通过混合扩展现有方法)。没有什么可以阻止你在普通NSWindow子类中这样做。

我知道它不是你所希望的“优雅解决方案”,但它是我唯一知道的最好的解决方案。我认为它稍微优雅一点,你不必在整个程序中随处插入自定义子类,但不太优雅,因为你使用的代码似乎错误地使用了Objective-c运行时。