UIAlertView 使程序崩溃

Posted

技术标签:

【中文标题】UIAlertView 使程序崩溃【英文标题】:UIAlertView makes the program crash 【发布时间】:2013-09-25 12:52:01 【问题描述】:

我遇到了崩溃:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue performTask:] may only be called from the main thread.'

我 2 天都找不到解决方案。 这是代码:

[alert dismissWithClickedButtonIndex:0 animated:YES];
UIAlertView *noTicketAlert = [[UIAlertView alloc] initWithTitle:@"Aradığınız kriterlere uygun bilet bulunamadı!" message:nil delegate:self cancelButtonTitle:@"Tamam" otherButtonTitles: nil];
[noTicketAlert show];

【问题讨论】:

愿意向我们展示您的警报视图代码吗? 这应该在 Xcode 4 和 Xcode 3 中崩溃了。 我认为错误信息不会更明确。 它是 xcode 5,程序正在运行 xcode 3 和 4。我尝试将我的应用程序升级为 ios7,但 uialertview 使我的应用程序崩溃 您似乎正在使用两个警报实例。能给个完整的代码吗? 【参考方案1】:

我通过尝试显示来自后台线程的警报触发了此错误。像这样修复:

dispatch_async(dispatch_get_main_queue(), ^
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:...
    [alertView show];
);

【讨论】:

【参考方案2】:

正常显示 UIAlertView 时出现此错误(没有有趣的按钮覆盖内容)。事实证明,我连续两次展示了它。我的解决方法是删除错误的重复调用。

如果您确实需要同时显示两个警报视图,并且您收到此错误,那么有效的修复(并解决错误消息本身)是在主线程上运行代码:

[[NSOperationQueue mainQueue] addOperationWithBlock:^
    
    // Your code that presents the alert view(s)
    ];

【讨论】:

【参考方案3】:

是的,我找到了解决方案,并与大家分享。 我试图覆盖 dismissWithClickedButtonIndex 函数,并发送了唯一的 buttonIndexes 就像9999 我的每个警报一样。 也就是说,

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
    [self viewWillDisappear:YES];
    if(buttonIndex == 9999) 
        noTicketAlert = [[UIAlertView alloc] initWithTitle:@"Aradığınız kriterlere uygun bilet bulunamadı!" message:nil delegate:self cancelButtonTitle:@"Tamam" otherButtonTitles: nil];
        [noTicketAlert show];
    

如果我想显示 noticketAlert,我将这个方法称为:

[alert dismissWithClickedButtonIndex:9999 animated:YES];

【讨论】:

【参考方案4】:

如果您有自定义按钮,请确保实现委托方法:

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView

    return YES;

如果没有找到这个选择器,那么程序就会崩溃..

【讨论】:

【参考方案5】:

对于那些寻找 Swift 2 解决方案的人,我遇到了类似的问题,并使用 @Dave Batton 的解决方案解决了它

dispatch_async(dispatch_get_main_queue(), 
    self.performSegueWithIdentifier("loginSegue", sender: self)
)

【讨论】:

以上是关于UIAlertView 使程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

显示 UIAlertView 时崩溃

UIAlertView 的私有方法崩溃

UIAlertView 崩溃应用

iOS 应用程序在警报视图关闭时崩溃

UIAlertView 在未记录的方法上崩溃

来自 UIAlertView _performPopup 的低级 iOS 崩溃