首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次使用NSApplication runModalForWindow

多次使用NSApplication runModalForWindow
EN

Stack Overflow用户
提问于 2015-04-07 10:39:47
回答 3查看 1.1K关注 0票数 0

我想知道是否允许使用runModalForWindow()启动多个模态循环。在我的应用程序中,我有以下设置:当用户按下非模态窗口A中的按钮A时,将使用runModalForWindow()打开模式窗口B。在模式窗口B中,有一个按钮B。如果用户按下该按钮B,则使用runModalForWindow()打开模式窗口C。当模态窗口C打开时,窗口A和B将从用户输入中被阻塞,而当模态窗口B打开时,窗口A将被阻塞。

这类工作使用runModalForWindow(),但是我遇到了一个小问题,这让我想知道我在这里做的事情是否被允许。当模式窗口C被打开时,我实际上可以在模态窗口C前面移动模式窗口B。B不接受任何输入,但实际上它可以在C前面移动,但是永远不能在B(或C)前面移动。它总是呆在后台。

有人知道为什么B可以在C前面移动,而A永远不能在B或C前面移动吗?允许多次使用runModalForWindow()吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-08 18:11:25

模态窗口的level设置为NSModalPanelWindowLevel。这是一个在普通窗口前面的窗口级别。这就是为什么你不能把窗户A放在窗户B前面。

但是,windows B和C都在同一级别。因此,窗口服务器不强制window始终位于窗口B的前面。

您可以尝试通过将window C的级别设置为高于NSModalPanelWindowLevel的级别来解决这个问题,但这在一般情况下可能会出现问题。如果增加太多,它可能会出现在系统UI元素的前面,比如菜单栏,或者像音量变化指示器那样的边框指示符。

您还可以使用addChildWindow(_:ordered)使窗口C成为窗口B的子窗口。它将强制执行指定的排序。它确实有一些副作用。例如,如果您移动窗口B,窗口C也会移动,以保持相对位置不变。

票数 1
EN

Stack Overflow用户

发布于 2015-04-08 16:26:55

因此,简而言之,你有这样的东西:

  1. 删除一些重要数据
  2. 窗口A“删除数据”
  3. 窗口B“确实要删除数据吗?”
  4. 窗口C“您非常确定要删除数据吗?”(在你试图删除数据的过程中,让A和B成为无助的旁观者)?

如果是这样的话,你可以使用两件事中的一件:

1)使用完成的NSAlert

代码语言:javascript
复制
//ALERT A
[alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {
    //handle the response!
    //ALERT B
    [alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {
        //handle the response!
        //ALERT C
        [alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {
            //handle the final responde
        }];
    }];
}];

2)使用完成块的模态窗口(见前面的:Custom Modal Window with Block Completion Handler)

代码语言:javascript
复制
i.e. When A closes, handler calls B, when B closes, handler called C etc... all serially

就我个人而言,我喜欢(2)的样子,但1是最直截了当的方法,没有任何可能出错的铃声和口哨。

编辑道歉,因为MD不喜欢我的代码格式:-/

票数 0
EN

Stack Overflow用户

发布于 2015-04-09 09:55:20

您没有做任何对[NSApplication runModalForWindow:]不合法的事情,在正常情况下,窗口C总是在B前面,而B总是在A前面,但是如果您在windowB上调用orderFront:,这可能会令人费解,在这种情况下,窗口被设置为最上面的窗口。

检查您的代码,您可能在某个地方有一个orderFront: (或者它的一个亲戚:orderFrontRegardlessorderWindow:relativeTo:)。另一种可能是可可虫,但这不太可能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29489572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档