No se pueden definir categorías para protocolos. Hay 2 maneras de evitar esto:
- uso de un nuevo protocolo formal
- utilizar un protocolo y el tiempo de ejecución informal comprobar
protocolo formal
Definir un nuevo protocolo formal sería el siguiente:
@protocol MyCustomMatrixDelegate <NSMatrixDelegate>
- (void) myNewMethod:(id)sender;
@end
Luego harías que tu clase personalizada se conforme o <MyCustomMatrixDelegate>
en lugar de <NSMatrixDelegate>
. Si utiliza este enfoque, hay algo que debe tener en cuenta: [self delegate]
probablemente se declarará como id<NSMatrixDelegate>
. Esto significa que no puede hacer [[self delegate] myNewMethod:obj]
, porque <NSMatrixDelegate>
no declara el método myNewMethod:
.
La forma de evitar esto es volver a escribir el objeto delegate
mediante un casting. Tal vez algo como:
- (id<MyCustomMatrixDelegate>) customDelegate {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
(Sin embargo, es posible que desee hacer algún tipo de comprobación de primera, como:
if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;
)
Y entonces usted haría:
[[self customDelegate] myNewMethod:obj];
Protocolo informal
Este es realmente un nombre de fantasía para una categoría en NSObject
:
@interface NSObject (MyCustomMatrixDelegate)
- (void) myNewMethod:(id)sender;
@end
Entonces simplemente no implementar el método. En su clase que enviaría el método, lo haría:
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
[[self delegate] myNewMethod:someSenderValue];
}
Intenté el método del protocolo formal. Funciona, sin embargo, el compilador advierte que el método personalizado no se puede encontrar en el protocolo. Agregué el protocolo formal a la interfaz del delegado e incluí el encabezado del delegado en el archivo de implementación del objeto al que estoy enviando el mensaje de delegado. ¿Tienes alguna idea de por qué todavía se queja? Gracias – David
@David edited answer –
Eres brillante. Funciona de maravilla. Gracias. – David