我想知道是否允许使用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()吗?
发布于 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也会移动,以保持相对位置不变。
发布于 2015-04-08 16:26:55
因此,简而言之,你有这样的东西:
如果是这样的话,你可以使用两件事中的一件:
1)使用完成的NSAlert
//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)
i.e. When A closes, handler calls B, when B closes, handler called C etc... all serially就我个人而言,我喜欢(2)的样子,但1是最直截了当的方法,没有任何可能出错的铃声和口哨。
编辑道歉,因为MD不喜欢我的代码格式:-/
发布于 2015-04-09 09:55:20
您没有做任何对[NSApplication runModalForWindow:]不合法的事情,在正常情况下,窗口C总是在B前面,而B总是在A前面,但是如果您在windowB上调用orderFront:,这可能会令人费解,在这种情况下,窗口被设置为最上面的窗口。
检查您的代码,您可能在某个地方有一个orderFront: (或者它的一个亲戚:orderFrontRegardless或orderWindow:relativeTo:)。另一种可能是可可虫,但这不太可能。
https://stackoverflow.com/questions/29489572
复制相似问题