MOC 后台保存后的 UIAlertView 有效 iOS 7 而不是 iOS 8

UIAlertView after MOC background save works iOS 7 not iOS 8

我有一个父详细视图控制器,它为子详细视图提供通用的自定义功能。

父项包含两个自定义函数。

一个函数触发后台保存到两个 NSManagedObjectContext,立即保存主 MOC 以释放 UI,然后保存私有 MOC。 iOS 8.

之前相当标准的设置

下面的函数呈现一个UIAlertView来确认保存成功。这包括在设定的时间(大约半秒)后自动关闭的代码。

一切正常 运行 iOS 7,无论是在设备上还是在模拟器上。

当 运行 iOS 8 时,这会导致设备和模拟器崩溃。

五个子详细信息视图中只有一个存在问题。在详细并排比较之后,我确认它们每个都有相同的代码块和方法。

我在两个自定义函数中插入了断点。保存工作正常,但代码在尝试呈现 UIAlertView 后崩溃,仅在 运行 iOS 时提到 8. 调试器进入我不理解的机器代码。尝试的保存不会持续存在。

如果我注释掉警报视图,保存仍然存在,但显然我不再有用户的警报视图。

有什么建议吗?

更新

我想我可能找到了解决方案……某种程度上……还不确定……

UIAlertController 和这篇文章 NSHipster

在我的父详细视图控制器中增加 UIAlertView 代码解决了这个问题。

在我的 message 方法中,我现在检查 iOS 是否响应 UIAlertController class,如果它确实实例化 UIAlertController,否则实例化UIAlertView.

- (void)message {

    ...other code...

    if ([UIAlertController class]) {    //checking whether iOS responds to the UIAlertController class
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:titleComplete
                                                                   message:messageComplete
                                                            preferredStyle:UIAlertControllerStyleAlert];

        [self presentViewController:alert animated:YES completion: ^(void){
            [self performSelector:(@selector(dismissAlertController:)) withObject:alert afterDelay:durationMessageCompleteSave];
        }];
    //  [self dismissViewControllerAnimated:YES completion:nil];
    //  display time on screen too short using just the dismissViewController above, 
    //  so add into completion handler in call to presentViewController...

    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:titleComplete
                                                        message:messageComplete
                                                       delegate:self
                                              cancelButtonTitle:nil//self.localisedAlertButtonRemain
                                              otherButtonTitles:nil];//buttonOther, nil];

        [alertView setTag:010];
        [alertView show];
        [self performSelector:(@selector(dismissAlertView:)) withObject:alertView afterDelay:durationMessageCompleteSave];

    }
}

...

- (void)dismissAlertView:(UIAlertView *)alert {
    [alert dismissWithClickedButtonIndex:0 animated:NO];
}

- (void)dismissAlertController:(UIAlertController *)alert {
    [alert dismissViewControllerAnimated:YES completion:nil];
}