Как я создаю вложенный цикл выполнения после -[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;
}
Если есть заявление, которое мне нужно вставить, чтобы сделать то, что я хочу, то это тоже можно сделать.
Спасибо!