我对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上应该有什么不同。
有没有人知道错误是什么?
提前致谢。
答案 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];
但是,如果您需要在多个地方显示相同的提醒,最好为其创建一个单独的功能。