NSAlert不会消失

时间:2018-01-31 20:22:09

标签: objective-c macos cocoa appkit nsalert

我正在使用基于Apple示例代码的简单NSAlert,虽然显示效果很好,但它永远不会消失。

代码:

void DisplayAlert()
{
    NSAlert *alert = [[NSAlert alloc] init];
    NSLog(@"TEST");
    [alert addButtonWithTitle:@"OK"];
    [alert setMessageText:@"Yay!"];
    [alert setInformativeText:@"This is an informational alert."];
    [alert setAlertStyle:NSAlertStyleInformational];

    [alert runModal];

    NSLog(@"TEST2");
    [alert.window close];
    [alert release];
    NSLog(@"TEST3");
}

我已尝试使用和不使用[alert.window close]行,警报也不会消失。

我也试过制作第一行[[[NSAlert alloc] init] autorelease];,但这也无济于事。

显示所有NSLog条消息。

2 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,努力了很长时间,试图找到一种方法使消失的警报消失。

我的解决方案是完全放弃NSAlert,转而使用CFUserNotificationAlert。 This blocking alert APInon-blocking CFUserNotificationNotice API可用于显示与NSAlert生成的对话框相同的独立警报对话框,但是当从简单的无窗口二进制文件运行时,可以与NSAlert对话框不同地将其关闭。

Here's an example of CFUserNotificationDisplayAlert和下面的一些代码预览:

#import <CoreFoundation/CoreFoundation.h>

int main(void) {
    CFOptionFlags cfRes;

    //display alert with 5 second timeout, at NoteAlertLevel
    CFUserNotificationDisplayAlert(5, kCFUserNotificationNoteAlertLevel, 
            NULL, NULL, NULL, 
            CFSTR("Testing"), 
            CFSTR("Click on any button..."), 
            CFSTR("OK"), 
            CFSTR("Cancel"), 
            CFSTR("Test Button"), 
            &cfRes);
    return cfRes;
}

答案 1 :(得分:-1)

您需要的方法是-orderOut:而不是-close。警报/面板窗口不是文档,不是&#34;关闭&#34;通常意义上讲。你就是他们消失的东西。