3

UIAlertView我在 iOS7 上有一个问题。当我启动我的应用程序时,它会崩溃并显示以下消息:

*** Assertion failure in -[UIKeyboardTaskQueue performTask:], /SourceCache/UIKit_Sim/UIKit-2903.2/Keyboard/UIKeyboardTaskQueue.m:388

错误发生在以下行:

- (IBAction)updatePositions:(id)sender{
     _alert = [[UIAlertView alloc] initWithTitle:@"text" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
     [_alert show];     <====== IT CRASHS HERE
     [NSThread detachNewThreadSelector:@selector(updateDataThread) toTarget:self withObject:nil];
}

我正在使用 ARC,属性_alert设置定义为:@property (nonatomic,strong)

这个错误看起来很奇怪,因为在 iOS6 上代码运行良好,我不知道在 iOS7 上应该有什么不同。

有谁知道错误可能是什么?

提前致谢。

4

6 回答 6

8

我遇到了同样的错误,问题是 UIAlertView 试图从不是主线程的线程中显示。

然而,崩溃并不总是发生,只有当第一个 AlertView 已经显示,而第二个 AlertView 也试图弹出时。

就我而言,一个简单的解决方法是:

    //Your code here
    ...

    //Alert
    _alert = [[UIAlertView alloc] initWithTitle:@"text" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];

    dispatch_async(dispatch_get_main_queue(), ^{
       //Show alert here
       [_alert show];
       });

    //Resume your code here
    ...
于 2013-11-03T03:22:24.747 回答
2

在忘记我是从后台线程工作后,我刚刚遇到了这个问题。我不知道这里是否是这种情况,但我会确保您不会尝试从主线程以外的任何地方调用 updatePositions:。

于 2013-10-05T01:28:44.127 回答
0

I had the same problem as well but not too familiar with the method dispatch_async. I used

[alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];

and the problem hasn't come up again.

于 2013-11-07T21:08:33.830 回答
0

你也可以这样做:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Your title" message:@"Your message" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];

但是,如果您需要在多个位置显示相同的警报,最好为其创建一个单独的函数。

于 2014-04-01T12:56:08.713 回答
0

将您的 alertview 代码放在一个单独的函数中,例如

-(void)showAlert
{
  _alert = [[UIAlertView alloc] initWithTitle:@"text" message:nil delegate:self    cancelButtonTitle:nil otherButtonTitles: nil];
   [_alert show];
}

然后在您的 IBAction 中执行此操作

- (IBAction)updatePositions:(id)sender
{
  [self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:YES];

  [NSThread detachNewThreadSelector:@selector(updateDataThread) toTarget:self withObject:nil];
}
于 2013-11-13T12:09:17.623 回答
0

像这样更改您的代码:

_alert = [[UIAlertView alloc] initWithTitle:@"text" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
[_alert show];

删除 @"text" 周围的 [[ 和 ]]

但是,你的我不认为你的问题来自这个 UIAlertView。

于 2013-10-03T15:01:34.813 回答