0

我是可可的新手。我想在没有任何按钮的情况下在 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];
}

当警报关闭时,我的应用程序无法单击任何按钮或交互?

4

5 回答 5

6

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

于 2015-09-12T23:54:12.583 回答
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];
        });
    }
}
于 2013-08-29T02:45:32.613 回答
1

NSAlert 被设计用于应用程序或窗口模式显示带有用于用户解除按钮的消息。它不是为显示没有按钮的窗口而设计的;你不应该这样使用它。

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

有关详细信息,请参阅模态窗口的工作原理

于 2013-08-29T03:30:03.537 回答
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];
于 2015-11-16T08:49:23.370 回答
0

关闭警报窗口后,您还必须使用 [NSApp abortModal] 中止模式

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

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

于 2014-05-15T16:41:43.533 回答