мой метод создания оповещения немедленно возвращается
Я полагаю, это потому, что, как говорит @Josh, лист работает модально только относительно окна, к которому он прикреплен; это не замораживает все приложение. Поэтому, как только beginSheetModal...
выполняется, остальная часть вашего метода продолжает выполняться, заканчивая return returnCode
(здесь возвращается -1), не дожидаясь ответа пользователя на предупреждение.
Код возврата является заменой, для которой кнопка на панели оповещений, которую пользователь заканчивает нажатием (NSAlertFirstButtonReturn, NSAlertSecondButtonReturn и т. Д. - они перечислены в конце класса NSAlert ref ). Вы используете его в своем методе alertDidEnd
, чтобы воздействовать на любую кнопку, которую пользователь нажал, чтобы отключить предупреждение. Вот почему селектор alertDidEnd
включает код возврата.
С другой стороны, когда вы используете метод runModal
в своем блоке else
, вам нужно явно вызвать alertDidEnd
и передать ему число, возвращаемое, когда заканчивается метод runModal
- когда пользователь отклоняет предупреждение.
Вот пересмотренная версия вашего кода:
int returnCode = -1;
if (displayAsSheet) {
[alert beginSheetModalForWindow:nativeWindow modalDelegate:delegate didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];
// The selector alertDidEnd has the returnCode int. The alert will then set that code to whatever the user chooses, and will send the altered int on to alertDidEnd.
}
else {
// Here, everything stops once runModal is called, until the user dismisses the alert, at which time the runModal method returns the int representing the button the user pushed, and you assign the return to your variable "returnCode."
returnCode = [alert runModal];
[self alertDidEnd:alert returnCode:returnCode contextInfo:nil];
}
// Omit the line returning the returnCode.
Тогда метод alertDidEnd
делает что-то вроде этого:
- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
switch (returnCode) {
case NSAlertFirstButtonReturn:
// Do whatever should happen when first button is pushed.
break;
case NSAlertSecondButtonReturn:
// Do whatever should happen when second button is pushed.
break;
default:
break;
}
// Unfreeze things.
[[NSApplication sharedApplication] stopModal];
}
Кстати, - это способ запуска листа и замораживания всего приложения, а не только окна, к которому прикреплен лист, если вы этого хотите: модальные подсказки