我在程序中注意到,当我调用NSRunAlertPanel()时,它等待返回(用户尚未单击按钮)时,NSTimer()不会触发。它会定期触发,完美触发直到NSRunAlertPanel()行,但是直到用户单击对话框上的按钮时才再次调用。
即使对话框出现在屏幕上,也可以保持计时器运行吗?
最佳答案
警报面板正在启动其自己的事件循环(通过-[NSApplication runModalForWindow:]
,与计时器最初计划的(可能是主)事件循环分开。这是为了防止用户与应用程序的任何其他元素进行交互,直到警报发出为止。被处理。
在我的脑海中,有两种方法可以使计时器在面板出现时仍能启动:运行主运行循环,并将计时器添加到面板的运行循环中。老实说,我不确定这两种方法如何解决。
首先,您可以很容易地获得应用程序的主运行循环:[NSRunLoop mainRunLoop]
,然后在短时间内(不到一秒钟)将其告知runUntilDate:
。这将要求您设置一个(while
)循环,在该循环中,主运行循环和模态运行循环交替交替运行一小段时间。这里的问题是让主运行循环处于活动状态将允许处理输入,从而破坏了面板的模式。
对于第二个,您只需参考计时器,然后执行[[NSRunLoop currentRunLoop] addTimer:forMode:]
。我不确定这是如何将计时器的触发日期与重新添加到另一个循环中进行交互,但是您可以尝试一下。
希望我是一个白痴,并且确实缺少一些明显的东西,并且很快就会有正确的解决方案出现另一个答案。
关于objective-c - NSRunAlertPanel暂停NSTimer吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11962122/