gpt4 book ai didi

objective-c - 如何让 NSPopover 的分离窗口变成模态窗口

转载 作者:行者123 更新时间:2023-12-04 06:01:38 26 4
gpt4 key购买 nike

在 MAC OS X 10.7 中,Apple 引入了一个名为 NSPopover 的新类,您甚至可以将弹出 View 拖走,成为一个独立的 NSWindow。但是,我想阻止用户与主窗口交互,直到分离的窗口关闭。我怎样才能安全地做到这一点?

实际上,一个更常见(甚至更愚蠢)的问题应该是,如何在当前前窗口返回之前阻止任何用户交互?我也不懂编程。

最佳答案

我自己找到了解决方案。现在看起来工作正常。

为此,在将分离的窗口排序到前面并成为关键窗口后,以下代码将使其成为模态窗口(其中 currModalSession 是我自己定义的 iVar)。

- (void)windowDidBecomeKey:(NSNotification *)notification {
if (notification.object == detachedWindow) {
if (!detachedWindow.isModalPanel) {
currModalSession = [NSApp beginModalSessionForWindow:detachedWindow];
[NSApp runModalSession:currModalSession];
}
}
}

此外,您必须结束您打开的每个模态 session 。所以下面的代码完成了这项工作:
- (void)windowWillClose:(NSNotification *)notification {
if (notification.object == detachedWindow) {
if (currModalSession) {
[NSApp endModalSession:currModalSession];
}
}
}

注:你必须在这里使用 Modal Session 而不是 runModalForWindow 有两个原因:
  • 否则主窗口不会立即被阻止。我还不太明白原因。一种可能的解释是:runModalForWindow 不仅会阻止用户交互,还会阻止内部通信,因此主窗口可能需要更多时间准备就绪。
  • 如果您打算从分离的窗口运行另一个框架模态对话框(例如 NSOpenPanel),则返回时,分离的窗口将成为新模态对话框关闭之前的关键窗口,即 runModalForWindow 将卡住另一个要关闭的窗口。这意味着被关闭的窗口不会被关闭。
  • 关于objective-c - 如何让 NSPopover 的分离窗口变成模态窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8845057/

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