一个接一个地显示NSAlert表单模态

时间:2012-04-05 14:02:22

标签: objective-c cocoa modal-dialog 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]);
    }
}

有什么想法吗?我做错了什么?

2 个答案:

答案 0 :(得分:9)

只需将[[alert window] orderOut:nil]置于第一个警报结束方法的顶部即可。这实际上记录在-[NSAlert beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:\]的参考文献中。

答案 1 :(得分:2)

您必须通过使用performSelector:withObject:afterDelay或等效方法延迟下一个运行循环来显示工作表。