Escribo una subclase de UITableView y quiero que mi subclase maneje algunos de los métodos de UITableViewDelegate antes de pasarlos junto con el delegado "real", así como reenviar todos los métodos de UITableViewDelegate no implementados por mi subclase.Shared UITableViewDelegate
En la subclase I tienen una propiedad privada:
que mantiene el "delegado real" que todos los métodos no implementados deben enviar al. En mis dos métodos init puse
self.delegate = self;
y puedo reemplazar - (void) setDelegate: (id) como esto
-(void)setDelegate:(id<UITableViewDelegate>)delegate {
if (delegate != self) {
_trueDelegate = delegate;
} else {
[super setDelegate:self];
}
}
Entonces anular estos para manejar el reenvío de mensajes
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature *sig;
sig = [[self.delegate class] instanceMethodSignatureForSelector:aSelector];
if (sig == nil) {
sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
}
return sig;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL selector = anInvocation.selector;
if ([self respondsToSelector:selector]) {
[anInvocation invokeWithTarget:self];
} else {
[anInvocation invokeWithTarget:_trueDelegate];
}
}
El problema es que los métodos delegados no implementados nunca se invocan en la tabla vista, por lo tanto, no se les da la oportunidad de ser reenviados al objeto _trueDelegate.
Me trataron de comprobar por ellos aquí:
- (BOOL)respondsToSelector:(SEL)aSelector {
}
pero ese método no se llama a los métodos UITableViewDelegate aunque las capturas de otros métodos bien.
¿Ha declarado su clase extendida como conforme a los protocolos de delegado? –
Pregunto porque es posible que tableView use 'conformsToProtocol:' en lugar de 'respondsToSelector:' al llamar a métodos delegados. –
De hecho lo hice, ese podría ser el problema, lo comprobaré – Lance