Suponiendo sus propiedades son de valor-clave compatible (como lo serían si está utilizando @synthesize) también se debe aplicar validadores compatibles clave-valor. Eche un vistazo a la documentación de Apple sobre el asunto: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html
Lo importante a tener en cuenta es que la validación no ocurre automáticamente, excepto cuando se utilizan ciertos tipos de enlace. Llame al validador directamente o llamando al validateValue:forKey:error:
.
Puede invalidar el setter producido para llamar al validador antes de guardarlo, pero si está utilizando enlaces esto probablemente no sea lo que quiere hacer, ya que el validador se llamará más de una vez para una única modificación.
También tenga en cuenta que el validador puede cambiar el valor que se está validando.
Así que veamos su ejemplo (no probado, por cierto.No estoy cerca de un Mac):
@implementation MyClass
@synthesize myValue;
-(BOOL)validateMyValue:(id *)ioValue error:(NSError **)outError
{
if (*ioValue == nil) {
// trap this in setNilValueForKey
// alternative might be to create new NSNumber with value 0 here
return YES;
}
if ([*ioValue intValue] < 0) {
NSString *errorString = @"myValue must be greater than zero";
NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorString
forKey:NSLocalizedDescriptionKey];
NSError *error = [[[NSError alloc] initWithDomain:@"MyValueError"
code:0
userInfo:userInfoDict] autorelease];
*outError = error;
return NO;
} else {
return YES;
}
}
Si quisiera anular el colocador sintetizado y hacer que haga la validación (aún no probado):
- (void)setMyValue:(int)value {
id newValue = [NSNumber numberWithInt:value];
NSError *errorInfo = nil;
if ([self validateMyValue:&newValue error:&errorInfo]) {
myValue = [newValue intValue];
}
}
Se puede ver que teníamos para envolver el entero en una instancia NSNumber para hacer esto.
Probablemente valga la pena etiquetar esto con 'cocoa' y 'macosx'. No tengo una reputación lo suficientemente alta para eso. – toholio