Self.delegate отвечаетSoSelector:... не компилируется
Я внедрил протокол с дополнительным методом, а в вызывающем методе я хочу отправить respondsToSelector:
в self.delegate
, прежде чем отправить сообщение, но это не скомпилируется. Сообщение об ошибке:
Нет Известный метод экземпляра для селектора 'отвечаетSoSelector'.
Как работа, я "дезинфицировал" делегата, как показано ниже, который компилируется...
//MyClass.h:
@class MyClass;
@Protocol MyClassDelegate
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end
@interface MyClass : UIViewController
@property (nonatomic, weak) id<MyClassDelegate> delegate;
@end
и
//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];
}
.
Я проверил несколько сообщений, включая этот, но он не отвечает на вопрос об ошибке компиляции.
Кроме того, альтернативные аксессоры не работают...
[self delegate]
//or
_delegate
Кто-нибудь видел это или может посоветовать лучший способ обработки?
IOS 5.0: (9A334), Xcode 4.2.1 (4D502)
Ответы
Ответ 1
-respondsToSelector:
- метод для NSObject. Либо предположите, что ваш делегат id
на самом деле является NSObject, и произносит его:
[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]
Или, лучше, сделайте ваш делегат явно NSObject:
@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;
Или сделать протокол суб-протоколом NSObject:
@protocol MyClassDelegate <NSObject>
Ответ 2
В основном вы говорите, что ваш делегат ограничен только вашим протоколом <MyClassDelegate>
, поэтому компилятор предполагает, что это единственные доступные методы. Что вам нужно сделать, так это продлить протокол <NSObject>
следующим образом:
@Protocol MyClassDelegate <NSObject>
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end
Таким образом, компилятор знает, что любой объект, который соответствует вашему протоколу, также соответствует протоколу <NSObject>
, который определяет respondsToSelector:
.