可以在Cocoa中创建没有按钮的NSAlert

时间:2013-08-29 02:28:46

标签: objective-c macos cocoa

我是Cocoa的新手。现在我想在iOS中创建一个消息框同样没有任何按钮。 NSTimer后消息框自动关闭。我使用下面的代码,但它总是添加确定按钮。请给我任何建议。提前谢谢。

alert = [[[NSAlert alloc] init] autorelease];
   // [alert addButtonWithTitle: @"OK"];
    [alert setMessageText: @"Attention!!! This a critical Alert."];
    [alert setInformativeText:@"Scanning..."];
    [alert setAlertStyle: NSInformationalAlertStyle];

    NSTimer *myTimer = [NSTimer timerWithTimeInterval: 17.0
                                               target:self
                                             selector: @selector(killWindow:) userInfo:nil
                                                                 repeats:NO];

    [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSModalPanelRunLoopMode];

    int choice = 0;
    choice = [alert runModal];
    if(choice != 0)
        [myTimer invalidate];

KillWindow功能:

 -(void) killWindow: (NSTimer *) theTimer
{
    NSLog(@"killWindow");
    [[alert window] close];
}

当警报关闭时,我的应用无法点击任何按钮或互动?

5 个答案:

答案 0 :(得分:6)

也许在2013年答案是否定的。但是,在当前的SDK(Xcode 7.0 with OS X 10.11)中,你可以简单地通过addButtonWithTitle(“”)添加“”,然后按钮就不会显示。

答案 1 :(得分:1)

你应该看看MBProgressHUD。我使用MBProgressHUD解决了这个问题。

+ (void)showMessage:(NSString *)message forDuration:(NSTimeInterval)duration withTitle:(NSString *)title
{
    UIWindow *window     = [UIApplication sharedApplication].keyWindow;
    MBProgressHUD *hud   = [MBProgressHUD showHUDAddedTo:window animated:YES];
    hud.mode             = MBProgressHUDModeText;
    hud.labelText        = title;
    hud.detailsLabelText = message;

    hud.removeFromSuperViewOnHide = YES;
    [hud hide:YES afterDelay:duration];
}

经过一些用户测试后,决定用户不喜欢他们无法解雇的长时间留言。

+ (void)showMessage:(NSString *)message forDuration:(NSTimeInterval)duration withTitle:(NSString *)title
{
    if (duration < 3.0) {
        UIWindow *window     = [UIApplication sharedApplication].keyWindow;
        MBProgressHUD *hud   = [MBProgressHUD showHUDAddedTo:window animated:YES];
        hud.mode             = MBProgressHUDModeText;
        hud.labelText        = title;
        hud.detailsLabelText = message;

        hud.removeFromSuperViewOnHide = YES;
        [hud hide:YES afterDelay:duration];
    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                            message:message
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];

        int64_t delayInSeconds = duration;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [alertView dismissWithClickedButtonIndex:alertView.cancelButtonIndex animated:YES];
        });
    }
}

答案 2 :(得分:1)

NSAlert旨在用于带有用户解雇按钮的消息的应用程序或窗口模式显示。它不是用于显示没有按钮的窗口;你不应该这样使用它。

您应该使用自定义NSWindow / NSPanel。如果您希望它阻止窗口/应用程序,那么您将需要运行自己的模态会话。除了像上面那样关闭窗口之外,还可以使用abortModal从计时器回调中停止模态会话。这解释了为什么当警报关闭时你没有得到任何进一步的事件 - 模态会话仍在运行。

有关详细信息,请参阅How Modal Windows Work

答案 3 :(得分:1)

是的,你可以添加新按钮。之后,你得到它并隐藏它:)。我的代码

NSAlert* alert = [[NSAlert alloc] init];
[alert setMessageText:@"Loading...."];
[alert addButtonWithTitle:@"Cancel"];
NSButton *button =  [[alert buttons] objectAtIndex:0];
[button setHidden:YES];
[alert setAccessoryView:[self viewLoadingReadFile]];
[alert setAlertStyle:NSWarningAlertStyle];
[alert runModal];

答案 4 :(得分:0)

关闭警报窗口后,您必须使用[NSApp abortModal]

中止模式

现在只需隐藏该按钮即可。为此,在实例化警报后,您可以在NSButton的所有alert.window.contentView.subviews中扫描,其标题为&#34; OK&#34;并隐藏它。

免责声明:这是一个快速,丑陋的黑客,但它现在有效。使用风险自负