Vâng, rõ ràng không ai đã khác (tốt hơn?) Giải pháp, vì vậy đây là cách tiếp cận của tôi:
Trong AppController tôi thêm một trường hợp biến errorString
và phương pháp này:
- (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];
}
các UIAlertView
đại biểu sẽ hiển thị một MFMailComposeViewController
với errorString
dùng font courier mát mẻ :) nếu "Gửi báo cáo" được khai thác. Nếu không nó gọi 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:@"[email protected]"];
[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();
}
}
Và MFMailComposeViewControllerDelegate
màn hình một giây UIAlertView
chỉ với một nút (rõ ràng là nút có chỉ số 0, vì vậy nó sẽ gọi 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];
}
Lệnh 'hủy bỏ()' gọi là có một chiến thuật sợ hãi. – BoltClock
Dù sao nó sẽ phụ thuộc vào bộ điều khiển kết quả tìm nạp đang tìm kiếm. Điều đó có nghĩa là đối với những thứ khác nhau trong ứng dụng của bạn, bạn sẽ muốn xử lý lỗi khác nhau. Câu hỏi của bạn về * chính xác những gì cần làm * với đối tượng 'NSError' đó vẫn hợp lệ, vì vậy +1 – BoltClock
Tôi có xu hướng nhận được cảnh báo trên màn hình hiển thị bản địa hóa của NSError, để người dùng có điều gì đó báo cáo về hỗ trợ kỹ thuật. –