Una cosa con la que siempre he tenido problemas en Cocoa Bindings ha sido la presentación de errores, por ejemplo, cuando el usuario escribe el valor incorrecto en un campo de texto con un formateador adjunto. Normalmente anularía willPresentError:
en algún lugar de la cadena de respuesta, pero mi problema es que los objetos NSError creados por el sistema de enlaces no contienen suficiente información para decirme qué falló, o si incluso es un error que me interesa personalizar. Podría eliminar por completo los enlaces de la ecuación y crear mis propios errores cuando se produzcan problemas de validación, pero creo que estaría tirando algunas cosas útiles de esa manera.¿Cómo puedo anular la presentación de NSError cuando se trata de enlaces?
He podido evitar esto implementando los métodos de delegado NSControl y almacenando el control que falló en una variable de instancia en mi controlador de vista. Si no es nulo en el momento en que willPresentError:
rueda, sé lo que no pudo validar.
- (BOOL)control:(NSControl *)control didFailToFormatString:(NSString *)string errorDescription:(NSString *)error;
{
_errorSender = [control retain];
return NO;
}
- (NSError *)willPresentError:(NSError *)error;
{
if (_errorSender != nil)
{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:[error userInfo]];
NSString *help = NSLocalizedString(@"Why are you always messing up? You are a terrible person.", @"");
[_errorSender release];
_errorSender = nil;
[userInfo setObject:help forKey:NSLocalizedRecoverySuggestionErrorKey];
return [NSError errorWithDomain:[error domain] code:[error code] userInfo:userInfo];
}
return [super willPresentError:error];
}
Esto funciona cuando los primeros cambios de respuesta, pero no cuando llamo commitEditing
en el controlador de la vista, así que es sólo parcialmente útil para mí.
La única otra opción que puedo ver es sacar NSFormatter de la ecuación y usar validateValue:forKey:error:
en mis objetos administrados Core Data para manejar la validación. Esto no tiene tanto sentido para mí como el uso de un formateador, pero al menos tendría el control total sobre el objeto NSError.
Siento que me falta algo para que haya este tipo de desconexión con el manejo de errores. ¿Alguna sugerencia?
Estoy subclases NSFormatter, y mientras que los enlaces utiliza el mensaje de error NSString, proporciono el NSAlert final es aún bastante básico (me gustaría añadir una sugerencia de recuperación al error, como mínimo). La validación que estoy haciendo parece ser más adecuada para mis subclases NSFormatter, por lo que dudo en implementar la validación de clave-valor en mi modelo. Terminaría haciendo todo tipo de análisis sintáctico de cadenas que no tiene nada que ver con el modelo de datos, solo para poder personalizar el mensaje de error de la interfaz de usuario cuando algo sale mal. –