iOS 6.1.2 - 为什么UIAlertView不被解雇?背景仍然在屏幕上

时间:2013-04-27 05:03:18

标签: ios objective-c ios6 uialertview

这是我的代码:

UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:nil cancelButtonTitle: @"ok" otherButtonTitles: nil];
[someError show];

当我点击确定按钮时,警报背景仍然存在,我点击屏幕,状态栏闪烁。

我找到了一些答案,但它们无效,我将代码更改为:

dispatch_async(dispatch_get_main_queue(), ^{
       UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:nil cancelButtonTitle: @"ok" otherButtonTitles: nil];
       [someError show];
});

或设置代理:

dispatch_async(dispatch_get_main_queue(), ^{
       UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:self cancelButtonTitle: @"ok" otherButtonTitles: nil];
       [someError show];
});

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [alertView dismissWithClickedButtonIndex:buttonIndex animated:NO];
    });

}

它仍然不起作用,然后我尝试:

UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"error" delegate:nil cancelButtonTitle: @"ok" otherButtonTitles: nil];
[someError performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];

不工作,疯了,这也不行:

[self performSelectorOnMainThread:@selector(showAlert:) withObject:@"error", nil)  waitUntilDone:NO];

// the show Alert function
-(void)showAlert:(NSString*)str
{
    UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message: str delegate: nil cancelButtonTitle: @"ok" otherButtonTitles: nil];
    [someError performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];
}

仍然无效。

警报显示之前和之后:

before the alert show after tap ok

4 个答案:

答案 0 :(得分:3)

确保您的视图控制器(或者您从哪里创建UIAlertView)在@interface行中定义了“<UIAlertViewDelegate>”。例如:

@interface YellowViewController : UIViewController <UIAlertViewDelegate>

现在,当您从子类视图控制器创建UIAlertView并将委托设置为self时,您的视图控制器应该符合并且应该接收委托协议方法。

接下来的事情。这段代码对我来说是正确的:

dispatch_async(dispatch_get_main_queue(), ^{
       UIAlertView *someError = [[UIAlertView alloc] initWithTitle:nil message:@"Server Error!" delegate:self cancelButtonTitle: @"ok" otherButtonTitles: nil];
       [someError show];
});

但是您的委托方法调用将在主线程上发生(这是所有UI发生的地方):

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [alertView dismissWithClickedButtonIndex:buttonIndex YES];
}

换句话说,摆脱那里的调度东西,看看会发生什么。然后,the Apple documentation for "clickedButtonAtIndex:" says

  

<强>讨论

     

此方法后接收器将自动关闭   被调用。

因此,您可能不需要实际明确地忽略警报视图。

答案 1 :(得分:1)

所有UIKit的东西必须在主线程中工作,确保在主线程中调用alertView。此外,显示提醒的视图必须位于主线程中

答案 2 :(得分:0)

我得到了解决方案,或者更确切地说是这种情况发生的问题。好吧,我迟到但我相信你必须使用一些外部库来显示进度,如“SVProgressHUD”或“MBProgressHUD”。这些库与主WINDOW层次结构的数量很大,结果导致UIAlertView或Picker Controller等本机UI元素出现问题。唯一可以解决这个问题的方法是尝试不使用我在上面命名的第三方库(如果有的话) 。一切都很好。对我来说,这对我来说是个愚蠢的事。

答案 3 :(得分:0)

嗯,我也遭受了同样的痛苦。我尝试了一切,但没有奏效。这是对我有用的东西,希望你也会觉得它很有帮助。

编写一个UIAlertView委托方法并在其中放置一个断点。

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

现在恢复,你会注意到昏暗效果消失了。所以只需在这个代表中加上0.5秒的延迟,希望你的问题得到解决。嗯,这对我有用

编写UIAlertView委托方法并在其中加入断点。

[NSThread sleepForTimeInterval:0.5];