Как я создаю вложенный цикл выполнения после -[NSAlert beginSheetModalForWindow:], который позволяет другим событиям происходить, но не возвращается, пока alertDidEnd:?

В Windows и GTK+ возможно иметь полностью вложенный цикл выполнения, который все еще может перекачивать события в окна, которые не ожидают модального ввода. Однако, с Какао, все, что я вижу для 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+, поэтому я не могу использовать новый блочный метод NSAlert, который был представлен в 10.9.

Спасибо!

Обновить

Теперь у меня есть некоторый фактический код, чтобы показать для этого:

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

Если есть заявление, которое мне нужно вставить, чтобы сделать то, что я хочу, то это тоже можно сделать.

Спасибо!

0 ответов

Другие вопросы по тегам