fab*_*789 10 iphone objective-c nserror nsfetchedresultscontroller ios
这是来自Apple示例代码:
if (![fetchedResultsController_ performFetch:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
...
If it is not possible to recover from the error, ...
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否真的有必要总是终止应用程序?你怎么能" 用代码替换这个实现来适当地处理错误 "?你将如何" 从错误中恢复 "?
任何建议都将受到赞赏,Fabian
好吧,显然没有人有另一个(更好的?)解决方案,所以这是我的方法:
在我的AppController中,我添加了一个实例变量errorString和这个方法:
- (void)presentCoreDataError:(NSError *)error
withText:(NSString *)text
{
NSMutableString *localErrorString = [[NSMutableString alloc] init];
[localErrorString appendFormat:@"Failed to %@: %@", text, [error localizedDescription]];
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if(detailedErrors != nil && [detailedErrors count] > 0) {
for(NSError* detailedError in detailedErrors) {
[localErrorString appendFormat:@"- Detail: %@", [detailedError userInfo]];
}
} else {
[localErrorString appendFormat:@"- %@", [error userInfo]];
}
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Failed to %@", text]
message:@"Please send a report to the developer."
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Send Report", nil] autorelease];
[alert show];
self.errorString = localErrorString;
[localErrorString release];
}
Run Code Online (Sandbox Code Playgroud)
该UIAlertView委托将显示MFMailComposeViewController与errorString在凉爽的Courier字体:)如果"发送报告"被窃听.否则它会调用abort():
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) { // Send Report
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
NSArray *toRecipients = [NSArray arrayWithObject:@"first@example.com"];
[picker setToRecipients:toRecipients];
[picker setSubject:@"Error Report"];
[picker setMessageBody:[NSString stringWithFormat:@"The application crashed with the following error:<br><br><FONT FACE=%@> %@ </FONT>",
@"courier", errorString]
isHTML:YES];
[navigationController presentModalViewController:picker animated:YES];
[picker release];
} else {
abort();
}
}
Run Code Online (Sandbox Code Playgroud)
并且MFMailComposeViewControllerDelegate显示第二个UIAlertView只有一个按钮(显然按钮的索引为0,因此它将调用abort()):
- (void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
{
[navigationController dismissModalViewControllerAnimated:YES];
NSMutableString *messageString = [[NSMutableString alloc] init];
if (result == MFMailComposeResultSent) {
[messageString appendFormat:@"Thanks! "];
}
[messageString appendFormat:@"The application has to quit now."];
UIAlertView *abortAlert = [[[UIAlertView alloc] initWithTitle:nil
message:messageString
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] autorelease];
[abortAlert show];
[messageString release];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |