5

这是我的代码:

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];
}

还是不行。

警报显示前后:

在警报显示之前 点击确定后

4

4 回答 4

3

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

@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];
}

换句话说,摆脱那里的调度东西,看看会发生什么。再说一次,“”的Apple文档clickedButtonAtIndex:

讨论

调用此方法后,接收器会自动关闭。

因此,您可能不需要真正明确地关闭警报视图。

于 2013-04-27T07:15:05.780 回答
1

所有 UIKit 的东西都必须在主线程中工作,确保你的 alertView 在主线程中被调用。此外,显示警报的视图必须在 main thread中。

于 2013-04-28T01:46:53.057 回答
0

我得到了解决方案,或者更确切地说是发生这种情况的问题。好吧,我迟到了,但我确定您必须使用一些外部库来显示进度,例如“SVProgressHUD”或“MBProgressHUD”。这些库与主要 WINDOW 层次结构的库有很大的关系,这会导致本机 UI 元素(例如 UIAlertView 或更确切地说是 Picker Controller 等)出现问题。解决此问题的唯一方法是尽量不使用我上面提到的第三方库(如果有) . 那时一切正常。这对我来说也是一件非常愚蠢的事情。

于 2013-09-14T20:26:27.300 回答
0

好吧,我正在遭受同样的事情。我尝试了一切,但没有奏效。这是对我有用的方法,希望你也会发现它有帮助。

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

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

现在恢复,您会注意到暗淡的效果已经消失。因此,只需在此委托中延迟 0.5 秒,希望您的问题得到解决。好吧,它对我有用

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

[NSThread sleepForTimeInterval:0.5];
于 2013-09-19T17:02:00.203 回答