Anlaşılan kimse, işte benim yaklaşım başka (daha iyi?) Çözümüdür etti: Ben bir örneğini değişken errorString
ve bu yöntemi eklendi benim AppController olarak
:
- (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];
}
UIAlertView
temsilci serin kurye yazı errorString
ile MFMailComposeViewController
görüntüler :) dokunulduğunda "Raporu gönder" eğer. Aksi takdirde abort()
çağırır:
- (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();
}
}
Ve MFMailComposeViewControllerDelegate
görüntüler sadece bir düğme (o abort()
arayacak yüzden açıkçası düğmesi, indeks 0 vardır) ile ikinci UIAlertView
:
- (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];
}
'iptal()' çağrı korkutma taktiği var. – BoltClock
Her neyse, getirilen sonuç denetleyicisinin aradığı öğeye bağlı olacaktır. Bu, uygulamanızda farklı şeyler için, hatayı farklı şekilde ele almak isteyeceğiniz anlamına gelir. Sorunuz * * NSError' nesnesine tam olarak ne yapılması gerektiği * geçerli olsa da, +1 – BoltClock
NSError'ın yerelleştirilmişDescription öğelerini gösteren bir uyarı mesajı alıyorum, böylece kullanıcının teknik desteğe bildirecek bir şeyleri var. –