在 Windows 和 GTK+ 上,可以有一个完全嵌套的运行循环,它仍然可以将事件泵送到不等待模式输入的窗口。但是,对于 Cocoa,我看到的所有 NSAlert 都是-[NSAlert runModal]
影响所有窗口的 和-[NSAlert beginSheetForModal:...:]
,它们是给定窗口的模态,而不是代码模态。在这种情况下,代码模式意味着该函数在 NSAlert 被解除之前不会返回。(我还需要为其他各种对话框执行此操作,例如 NSOpenPanel。)
基本上我想知道的是,是否可以对调用进行建模,以-[NSAlert beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:]
安全地允许其他窗口事件继续运行,但在对话框关闭之前它本身不会返回。例如,像
[alert beginSheetModalForWindow:w modalDelegate:delegate didEndSelector:... contextInfo:NULL];
while (!delegate->done)
[NSApp doMainLoopIteration]; // not real
但不是那样活泼。或者甚至是类似的东西
[alert ...];
[delegate waitForAlertDidEnd];
这是从 C 函数调用的,用于与非 Objective-C 环境进行互操作。
这是可能的,还是我不走运?
这需要针对 Mac OS X 10.7+,所以我不能使用 10.9 中引入的新的基于块的 NSAlert 方法。
谢谢!
更新
现在我有一些实际的代码要显示:
NSInteger ret;
[box beginSheetModalForWindow:parent
modalDelegate:[NSApp delegate]
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
contextInfo:&ret];
// TODO
return (intptr_t) ret;
我希望 TODO 能够等待didEndSelector
运行,同时仍会触发其他事件。didEndSelector
是_
- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)data
{
NSInteger *ret = (NSInteger *) data;
*ret = returnCode;
}
如果有一个声明我需要放在那里以使我想要的工作,那也可以做到。
谢谢!