xcode - self.delegate respondsToSelector:... no compila
ios5 (2)
Implementé un protocolo con un método opcional y, en el método de llamada, deseo enviar respondsToSelector:
para self.delegate
antes de enviar el mensaje, pero eso no se compila. El mensaje de error es:
No Método de instancia conocido para el selector ''respondsToSelector'' .
Como solución alternativa, "desinfectar" al delegado como se muestra a continuación, que compila ...
//MyClass.h:
@class MyClass;
@Protocol MyClassDelegate
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end
@interface MyClass : UIViewController
@property (nonatomic, weak) id<MyClassDelegate> delegate;
@end
y
//MyClass.m:
...
@synthesize delegate = _delegate;
...
id sanitizedDelegate = self.delegate; //Hmmmm... why does this work?
if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) {
[self.delegate myClass:self willDoSomething:animated];
}
.
Revisé varias publicaciones, incluida esta, pero no responde el problema de compilación fallida.
Además, los accesorios alternativos no funcionan ...
[self delegate]
//or
_delegate
¿Alguien ha visto esto o puede aconsejar una mejor forma de manejo?
IOS 5.0: (9A334), Xcode 4.2.1 (4D502)
Básicamente, está diciendo que su delegado está limitado solo por su protocolo <MyClassDelegate>
, por lo que el compilador supone que esos son los únicos métodos disponibles. Lo que tiene que hacer es hacer que el protocolo amplíe <NSObject>
así:
@Protocol MyClassDelegate <NSObject>
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end
De esta forma, el compilador sabe que cualquier objeto que se ajuste a su protocolo también se ajusta al protocolo <NSObject>
que define respondsToSelector:
-respondsToSelector:
es un método en NSObject. Supongamos que su delegado de id
es, de hecho, un NSObject y lo lanzamos:
[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]
O mejor, haga que su delegado explícitamente sea un NSObject:
@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;
O haga que el protocolo sea un sub protocolo de NSObject:
@protocol MyClassDelegate <NSObject>