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