xcode ios5

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>