2012-04-05 1 views
1

Я хочу отобразить лист, и когда пользователь нажимает «ОК», покажите другой лист.Отображение модальных листов NSAlert один за другим

Однако при нажатии на кнопку «ОК» вся конструкция становится беспорядочной, как если бы у первого предупреждающего листа не хватило времени, чтобы исчезнуть.

Это код, я использую для листов:

#define CONFIRM_ALERT(X,Y,Z,W,V) \ 
NSAlert* confirmAlert = [NSAlert alertWithMessageText:X \ 
defaultButton:@"OK" \ 
alternateButton:@"Cancel" \ 
otherButton:nil \ 
informativeTextWithFormat:Y]; \ 
[confirmAlert beginSheetModalForWindow:Z \ 
modalDelegate:self \ 
didEndSelector:W \ 
contextInfo:V]; 

#define INFO_ALERT(X,Y,Z) \ 
NSAlert *infoAlert = [[NSAlert alloc] init]; \ 
[infoAlert addButtonWithTitle:@"OK"]; \ 
[infoAlert setMessageText:X]; \ 
[infoAlert setInformativeText:Y];\ 
[infoAlert setAlertStyle:NSInformationalAlertStyle]; \ 
[infoAlert beginSheetModalForWindow:Z modalDelegate:self didEndSelector:nil contextInfo:nil]; 

И как я использую его:

- (void)doSth 
{ 
     CONFIRM_ALERT(@"New Action", 
       @"Are you sure you want to proceed?", 
       [self window], 
       @selector(confirm:code:context:), 
       nil); 
} 

- (void)confirm:(NSAlert*)alert code:(int)choice context:(void *)filename 
{ 
    if (choice == NSAlertDefaultReturn) 
    { 
     INFO_ALERT(@"Success :-)", 
     @"The Action has been successfully completed.", 
     [self window]); 
    } 
} 

Любые идеи? Что я делаю не так?

ответ

8

Он должен работать, чтобы просто положить [[alert window] orderOut:nil] в начало первого метода оповещения. Это фактически подтверждено в справочной информации для -[NSAlert beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:\].

+0

Отличный ответ. Оно работает. Большое спасибо! :-) –

2

Вы должны показать лист в следующем цикле запуска, отложив его, используя performSelector:withObject:afterDelay или эквивалентный метод.