Mis clases de modelo se implementan principalmente con métodos setter/getter sintetizados y todo estaba bien. Todo estaba muy bien conectado a la interfaz de usuario. Más tarde me di cuenta de que cambiar una propiedad debería ocasionar el cambio de otras propiedades (cambiar type
podría causar cambios en minA
y maxA
) así que escribí manualmente los métodos setter/getter para la propiedad type
. Código sigue:¿Por qué recibo una excepción no detectada al implementar mis propios métodos KVC setter/getter
QBElementType
@interface QBElementType : NSObject
@property NSRange minRange;
@property NSRange maxRange;
@end
@implementation QBElementType
@synthesize minRange;
@synthesize maxRange;
@end
QBElement
@interface QBElement : QBElementType{
QBElementType *_type;
}
@property (weak) QBElementType *type;
@property NSUInteger minA;
@property NSUInteger maxA;
@end
@implementation QBElement
@synthesize minA = _minA;
@synthesize maxA = _maxA;
- (QBElementType*)type
{
return _type;
}
- (void)setType:(QBElementType*)newType
{
[self willChangeValueForKey:@"type"];
_type = newType; // no need to bother with retain/release due to ARC.
[self didChangeValueForKey:@"type"];
/* Having the following 4 lines commented out or not changes nothing to the error
if (!NSLocationInRange(_minA, newType.minRange))
self.minA = newType.minRange.location;
if (!NSLocationInRange(_maxA, newType.maxRange))
self.maxA = newType.maxRange.location;
*/
}
@end
PREGUNTA: Desde entonces, cada vez que cambiar el tipo de un elemento consigo un excepción no detectada:
No se puede actualizar para el observador < NSTableBinder ...> para la ruta de la clave "type.minRange" de < QBElement ...>, muy probablemente debido a que el valor de el "tipo" llave fue cambiado sin una adecuada MVA notificación siendo enviada. Verifique KVO-Compliance de la clase QBElement.
¿Hay algo obvio que me falta de KVO-Compliance? ¿Por qué obtengo este error?
He intentado ejecutar la aplicación sin 'willChangeValueForKey:' y 'didChange ....' pero la interfaz de usuario nunca ha sido notificada del cambio. (Nota al margen: minA es una variable en sí misma, podría no aparecer de esta manera porque simplifiqué el código para esta pregunta) –
En ese caso, hay algo más que está mal. Realmente no debería necesitar llamar 'willChange ...' y 'didChange ...' en un setter como ese. En cuanto a 'minA' es una variable en sí misma, entendida, y en ese caso mi sugerencia no funcionará. Sin embargo, quizás deba publicar el código completo, en caso de que su simplificación cambie o elimine el problema. –