2010-12-29 21 views
10

Bu Apple örnek koddan: Ben her zaman uygulamayı sonlandırmak gerçekten gerekli olup olmadığını merak ediyorumNSFetchedResultsController getirme hataları nasıl ele alınır?

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(); 
} 

? "bu uygulamayı hatayla uygun şekilde işlemek için bu uygulama yerine" nasıl ekleyebilirdiniz? Ve " hatasından nasıl kurtarırsınız?" Herhangi bir öneriniz mutluluk duyacağız

Fabian

+2

'iptal()' çağrı korkutma taktiği var. – BoltClock

+1

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

+0

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. –

cevap

7

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]; 
} 
+0

Bu çözümü üretimde kullandınız mı? Ayrıca hiç e-posta aldınız mı? – abellina

+0

Üretimde kullandım ve iki e-posta aldım. – fabian789

+1

@ fabian789 Hala yardımcı yıllar sonra, teşekkürler! Ayrıca, 'MFMailComposeViewController' fonksiyonunu başlatmadan önce cihazın e-posta gönderecek şekilde yapılandırılıp yapılandırılmadığını belirlemek için' [MFMailComposeViewController canSendMail] 'i de kullanabilirsiniz. – JWK

İlgili konular