UIAlertView崩溃iOS7 - 断言失败

时间:2013-10-03 14:58:44

标签: uikit ios7 uialertview uikeyboard assertion

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

*** 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上应该有什么不同。

有没有人知道错误是什么?

提前致谢。

6 个答案:

答案 0 :(得分: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
    ...

答案 1 :(得分:2)

忘记我是在后台线程工作后我才遇到这个问题。我不知道这是不是这样,但我确保你不会尝试从主线程以外的任何东西调用updatePositions。

答案 2 :(得分:0)

更改您的代码:

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

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

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

答案 3 :(得分:0)

我也有同样的问题,但对dispatch_async方法不太熟悉。我用了

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

并且问题再没有出现。

答案 4 :(得分: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];
}

答案 5 :(得分: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];

但是,如果您需要在多个地方显示相同的提醒,最好为其创建一个单独的功能。