主运行中心后台保存后的UIAlertView在iOS 7而不是iOS 8下工作
我有一个父局部视图控制器,它为子局部视图提供公共自定义函数 父函数包括两个自定义函数 一个函数触发后台保存到两个主运行中心后台保存后的UIAlertView在iOS 7而不是iOS 8下工作,ios,uitableview,ios8,parent-child,uialertview,Ios,Uitableview,Ios8,Parent Child,Uialertview,我有一个父局部视图控制器,它为子局部视图提供公共自定义函数 父函数包括两个自定义函数 一个函数触发后台保存到两个NSManagedObjectContexts,立即保存主MOC以释放UI,然后保存私有MOC。iOS 8之前的标准设置 以下函数显示一个UIAlertView,以确认保存成功。这包括在设定的时间(大约半秒)后自动关闭的代码 无论是在设备上还是在模拟器上,在运行iOS7时,这一切都可以正常工作 在设备和模拟器上运行iOS 8时,这会导致崩溃 五个子详图视图中只有一个存在此问题。在进行详
NSManagedObjectContext
s,立即保存主MOC以释放UI,然后保存私有MOC。iOS 8之前的标准设置
以下函数显示一个UIAlertView
,以确认保存成功。这包括在设定的时间(大约半秒)后自动关闭的代码
无论是在设备上还是在模拟器上,在运行iOS7时,这一切都可以正常工作
在设备和模拟器上运行iOS 8时,这会导致崩溃
五个子详图视图中只有一个存在此问题。在进行详细的并排比较之后,我确认它们都有相同的代码块和方法
我在两个自定义函数中插入了断点。保存工作正常,但在尝试显示UIAlertView
后,代码崩溃,这仅在运行iOS 8时提到。调试器进入我不理解的机器代码。尝试的保存不会持续
如果我注释掉alert视图,保存将持续,但显然我不再拥有该用户的alert视图
有什么建议吗
更新
我想我可能已经找到了解决办法。。。某种程度上。。。还不确定
UIAlertController
本文通过在我的父详细视图控制器中增加UIAlertView代码解决了这个问题
在我的message
方法中,我现在检查iOS是否响应UIAlertController
类,如果它确实实例化了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];
}
没有代码就很难给出正确的答案。但听起来好像它没有显示在主线程上。就我个人而言,我不会对储蓄表现出警惕。它会有点唠叨不断弹出一条消息,即使用户知道如果他按下save,它就会保存。谢谢你的反馈。如果您理解问题的概念和背景,并且遇到过类似问题,则本例中的代码是不相关的。我可以插入代码,但相关代码非常广泛。UI作用于主线程。我使用在我的核心数据堆栈中创建的私有和主MOC。我在代码的其他地方没有使用多线程。如前所述,此问题仅适用于五个几乎相同的子视图控制器中的一个,它们都在主线程上运行。专用MOC在主线程以外的其他线程中运行。如果视图控制器显示警报视图,但控制器在代理为控制器的警报视图之前释放,则也可能发生崩溃。感谢您的评论,但这些评论对我来说没有意义。当我写“不要在其他地方使用多线程”时,这些话意味着我承认私有MOC在主线程以外的线程上,并且在我的代码的任何部分中,多线程没有在其他任何地方使用。感谢您的建议,但就其性质而言,警报视图会劫持屏幕,当用户点击“后退”按钮释放“我的视图”及其控制器时,在警报视图之前释放该视图在数字上是不可能的。