【问题标题】: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 有两个原因:

  1. 否则主窗口不会立即被阻止。我还不太明白原因。一种可能的解释是:runModalForWindow 不仅会阻止用户交互,还会阻止内部通信,因此主窗口可能需要更多时间才能准备好。
  2. 如果你打算从分离的窗口运行另一个框架模态对话框(例如NSOpenPanel),返回时,分离的窗口将在新的模态对话框关闭之前成为关键窗口,即runModalForWindow将冻结另一个要关闭的窗口。这意味着要关闭的窗口不会关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多