2

在 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;
}

如果有一个声明我需要放在那里以使我想要的工作,那也可以做到。

谢谢!

4

0 回答 0