2011-05-11 6 views
12

Tengo problemas para encontrar ejemplos de la forma correcta de usar NSError, UIAlertView y NSErrorRecoveryAttempting en iOS. La mayoría de la documentación y ejemplos que puedo encontrar cubren la funcionalidad equivalente en OS X, donde los comportamientos relevantes están integrados por Cocoa. Pero en iOS parece ser necesario hacerlo "a mano", y no puedo encontrar buenos ejemplos de cómo se hace.¿Cuál es el uso correcto de NSErrorRecoveryAttempting, NSError y UIAlertView en iOS?

Agradecería mucho unos ejemplos de mejores prácticas en el uso de información en NSError para apoyar los intentos de recuperación de NSErrors informados al usuario.

+0

En un momento escribí el código para hacer exactamente eso (manejar la presentación de NSError usando UIAlertView, etc.), pero todavía no he visto un error que tenga un 'recoveryAttempter', así que no sé si realmente es correcto. – Anomie

Respuesta

6

De acuerdo con la documentación de Apple:

Importante: La clase NSError está disponible en Mac OS X y iOS. Sin embargo, los API y mecanismos de respuesta de error y recuperación de errores solo están disponibles en Application Kit (Mac OS X).

Por lo tanto, no estoy seguro de si se puede usar NSErrorRecoveryAttempting a pesar de que parece estar definido en la documentación (parece que esto es un área de la documentación UIKit que aún no han sido actualizados después de haber sido copiado de la documentación de AppKit).

Aquí es cómo manejar los errores en mi código:

NSError *error = nil; 
id result = [SomeClass doSomething:&error]; 

if (!result) { 
    NSLog(@"Do something failed: %@", error); 
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Something failed!" message:@"There was an error doing something." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; 
    [alert show]; 
    return; 
} 
+2

Como NSErrorRecoveryAttempting es un protocolo informal, todo lo que se necesita para que un objeto se conforme es implementar esos dos métodos. Y NSError en iOS ciertamente contiene las propiedades y constantes necesarias. El comentario de Apple aparentemente solo se refiere a los métodos de appkit específicos descritos [aquí] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorRespondRecover/ErrorRespondRecover.html) y [aquí] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ErrorHandlingCocoa/HandleReceivedError/HandleReceivedError.html). – Anomie

+0

NSErrorRecoveryAttempting funciona muy bien en iOS. Puedes verlo en el encabezado NSError.Lo que falta es la capacidad de pasar un error a una alerta como en MacOS X, esto es muy fácil de hacer agregando una categoría en UIAlertView que ejecuta la recuperación de errores y hay varios ejemplos de cómo hacer esto. – quellish

0

estoy tratando de reflejar mecanismo de manejo de errores de AppKit en UIKit, sobre todo porque quiero aprovechar la cadena de respuesta para reenviar errores hacia arriba. No lo he probado completamente, pero por el momento se ve como a continuación.

Refleja bastante AppKit, pero los ganchos will/did se pueden anular para realizar una presentación y recuperación de errores personalizados, respectivamente. El comportamiento predeterminado es mostrar un UIAlertView para la presentación y usar un objeto psuedo-NSErrorRecoveryAttempting para la recuperación.

@implementation UIResponder (ErrorHandling) 

- (void)presentError:(NSError *)error 
     completion:(void (^)(BOOL recovered))completion 
{ 
    if (nil == (error = [self willPresentError:error])) { 
     return; 
    } 
    if (self.nextResponder) { 
     [self.nextResponder presentError:error completion:completion]; 
     return; 
    } 

    // Code to create and show UIAlertView 
    // e.g. https://github.com/jayway/CWUIKit/blob/master/Classes/UIAlertView%2BCWErrorHandler.m 

    // The UIAlertViewDelegate calls didPresentError... 
} 

/* 
Override to customise the error object as in AppKit. 
You can also perform your own error presentation, and return nil to terminate the default handling. 
Custom error presentation UI should still call didPresentError... when dismissed 
*/ 
- (NSError *)willPresentError:(NSError *)error 
{ 
    return error; 
} 

/* 
Override to perform custom error recovery. 
*/ 
- (void)didPresentError:(NSError *)error optionIndex:(NSInteger)optionIndex completion:(void (^)(BOOL recovered))completion 
{ 
    id recoveryAttempter = [error recoveryAttempter]; 
    if ([recoveryAttempter respondsToSelector:@selector(attemptRecoveryFromError:optionIndex:completion:)]) { 
     [recoveryAttempter attemptRecoveryFromError:error optionIndex:optionIndex completion:completion]; 
    } 
} 

@end 
Cuestiones relacionadas