1

シートを表示したいのですが、ユーザーが「OK」をクリックすると、別のシートが表示されます。

しかし、「OK」をクリックした瞬間、最初のアラート シートが消える時間がなかったかのように、デザイン全体がぐちゃぐちゃになってしまいます。

これは私がシートに使用しているコードです:

#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]);
    }
}

何か案は?私は何を間違っていますか?

4

2 に答える 2

9

[[alert window] orderOut:nil]最初の alert-end メソッドの先頭に配置するだけで機能するはずです。これは、実際には のリファレンスに記載されています-[NSAlert beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:\]

于 2012-04-05T22:02:52.393 に答える
2

performSelector:withObject:afterDelayまたは同等の方法を使用してシートを遅延させることにより、次の実行ループでシートを表示する必要があります。

于 2012-04-05T18:43:49.727 に答える