Подождите, пока [NSAlert beginSheetModalForWindow: ...]; - PullRequest
18 голосов
/ 03 марта 2009

Когда я отображаю NSAlert, как это, я сразу получаю ответ:

int response;
NSAlert *alert = [NSAlert alertWithMessageText:... ...];
response = [alert runModal];

Проблема в том, что это модальное приложение, а мое приложение основано на документах. Я отображаю предупреждение в окне текущего документа, используя листы, например:

int response;
NSAlert *alert = [NSAlert alertWithMessageText:... ...];
[alert beginSheetModalForWindow:aWindow
                  modalDelegate:self
                 didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
                    contextInfo:&response];

//elsewhere
- (void) alertDidEnd:(NSAlert *) alert returnCode:(int) returnCode contextInfo:(int *) contextInfo
{
    *contextInfo = returnCode;
}

Единственная проблема с этим заключается в том, что beginSheetModalForWindow: возвращается сразу, поэтому я не могу с уверенностью задать вопрос пользователю и ждать ответа. Это не было бы большим делом, если бы я мог разделить задачу на две области, но я не могу.

У меня есть цикл, который обрабатывает около 40 различных объектов (которые находятся в дереве). Если происходит сбой одного объекта, я хочу, чтобы предупреждение показывало и спрашивало пользователя, продолжать ли или прерывать (продолжить обработку в текущей ветви), но, поскольку мое приложение основано на документе, в Руководстве по интерфейсу пользователя Apple предписывается использовать листы, когда предупреждение специфичные для документа.

Как я могу отобразить лист предупреждения и ждать ответа?

Ответы [ 11 ]

0 голосов
/ 03 марта 2009

В отличие от Windows, я не верю, что есть способ блокировать модальные диалоги. Ввод (например, пользователь нажимает кнопку) будет обработан в вашем основном потоке, поэтому блокирование невозможно.

Для выполнения вашей задачи вам придется либо передать сообщение в стек, а затем продолжить с того места, где вы остановились.

...