我是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];
}
当警报关闭时,我的应用无法点击任何按钮或互动?
答案 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;并隐藏它。
免责声明:这是一个快速,丑陋的黑客,但它现在有效。使用风险自负