【问题标题】:How to make NSPopover 's detached window become modal window如何使 NSPopover 的分离窗口成为模态窗口
【发布时间】:2012-01-13 02:09:18
【问题描述】:
在 MAC OS X 10.7 中,Apple 引入了一个名为 NSPopover 的新类,您甚至可以拖走该弹出视图以成为独立的 NSWindow。但是,我想阻止用户与主窗口进行交互,直到关闭分离的窗口。我怎样才能安全地做到这一点?
实际上,一个更常见(甚至更愚蠢)的问题应该是,如何在当前前窗口返回之前阻止任何用户交互?我也不懂编程。
【问题讨论】:
标签:
objective-c
macos
modalviewcontroller
nswindow
【解决方案1】:
我自己找到了解决方案。现在看起来工作正常。
要做到这一点,在分离窗口排序到前面并成为关键窗口之后,下面的代码将使它成为一个模态窗口(其中currModalSession是我自己定义的一个iVar)。
- (void)windowDidBecomeKey:(NSNotification *)notification {
if (notification.object == detachedWindow) {
if (!detachedWindow.isModalPanel) {
currModalSession = [NSApp beginModalSessionForWindow:detachedWindow];
[NSApp runModalSession:currModalSession];
}
}
}
此外,您必须结束您打开的每个模态会话。所以下面的代码完成了这项工作:
- (void)windowWillClose:(NSNotification *)notification {
if (notification.object == detachedWindow) {
if (currModalSession) {
[NSApp endModalSession:currModalSession];
}
}
}
注意:你必须在这里使用 Modal Session 而不是 runModalForWindow 有两个原因:
- 否则主窗口不会立即被阻止。我还不太明白原因。一种可能的解释是:runModalForWindow 不仅会阻止用户交互,还会阻止内部通信,因此主窗口可能需要更多时间才能准备好。
- 如果你打算从分离的窗口运行另一个框架模态对话框(例如NSOpenPanel),返回时,分离的窗口将在新的模态对话框关闭之前成为关键窗口,即runModalForWindow将冻结另一个要关闭的窗口。这意味着要关闭的窗口不会关闭。