gpt4 book ai didi

cocoa - "beginModalSessionForWindow"导致无模式 session ?

转载 作者:行者123 更新时间:2023-12-03 16:32:32 24 4
gpt4 key购买 nike

我正在构建一个带有主窗口和子窗口的应用程序,我想将其呈现为模式 session 。所以我在窗口 Controller 中使用此代码:

self.session = [[NSApplication sharedApplication] beginModalSessionForWindow: self.window];
[[NSApplication sharedApplication] runModalSession: self.session];

但是,无论我将此代码放在何处 - 在 windowDidLoad 中,在主窗口的 post-windowDidLoad 调用中,甚至在窗口 Controller 的 init 函数中 - 我得到的是一个无模式子窗口。子窗口出现在主窗口上方,但主窗口继续响应输入事件。

我做错了什么?

最佳答案

nvm - 通过阅读一些示例找到了我的答案。 (在 Stack 上发布之前进行的数小时研究再次未能给出答案,而我在发布之后偶然发现了见解。)

对于后代,答案如下:beginModalSessionForWindow 不像 runModalForWindow 那样工作。

使用 runModal,您可以在任何地方执行该代码,Cocoa 将立即停止除模态窗口之外的所有处理。 (不幸的是,这包括与非 UI 事件绑定(bind)的用于后台处理的计时器。)执行 runModal 的代码被阻止,并且仅在模态窗口关闭后才恢复。系统强制执行窗口的模式。

beginModalSessionForWindow 的工作方式非常不同。无论您在哪里执行它,代码都会启动模式窗口然后继续执行。在一般用例中(如 Apple 的示例所示),如果您在循环之前调用 beginModal,然后以轮询 session 状态为循环条件,则循环可以执行您想要的任何其他处理;并且在循环期间,它还会阻止正常的 UI 事件 - 就像执行长时间运行的循环时的任何 IBAction 一样。

重点是 beginModalSession 实际上并不强制窗口的任何模式。相反,您的代码通过执行长时间运行的循环来强制窗口的模式。如果您不使用循环,而是让“模态” session 运行并恢复普通事件循环...那么您的其他窗口将获得所有事件处理,包括 UI 事件。 “模态”窗口变为无模态。

我认为“beginModalSessionForWindow”实际上应该被称为beginModelessSessionForWindow,因为这就是它的作用:它创建一个无模式窗口并返回。

关于cocoa - "beginModalSessionForWindow"导致无模式 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627541/

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