2010-11-22 4 views
12

я создал делегат для классатребующие дополнительные методы делегата

@protocol gameDelegate <NSObject> 
@optional 
-(void)gameStarted; 
@required 
@end 

сейчас в моем игровом объекте я назвал этот метод:

[self.delegate gameStarted]; 

так что теперь, если я инициировать этот объект в любом месте и установить делегировать все работает нормально до тех пор, пока не будет вызван gameStated, потому что он не реализован в основном объекте, где создан игровой объект (поскольку он необязателен).

я попробовал некоторые вариации этого

if(![self.delegate respondsToSelector: @selector(gameStarted)]) { 
    //[self.delegate gameStarted]; 
} 

, но это не работает для меня. любые идеи, как сделать это «действительно» дополнительным?

заранее спасибо

ответ

18

Опустит отрицание от вашего if заявления:

if ([self.delegate respondsToSelector:@selector(gameStarted)]) { 
    ... 
} 
+0

Боже мой: D я использовал это, если заявление первым для раннее возвращение, если оно не отвечает, а затем я просто скопировал его для этого метода. какая глупая ошибка. спасибо – choise 2010-11-23 09:34:51

0

Проверяется делегат реализует дополнительный метод и затем вызвать это такой общий шаблон, который я использую макрос препроцессор SAFE_CALL который проверяет respondToSelector:, а затем вызывает метод.

Макрос является:

#define SAFE_CALL(obj,method) \ 
([obj respondsToSelector:@selector(method)] ? [obj method] : nil) 

и используются так:

SAFE_CALL(sourceDelegate, refresh) 
// or 
NSString *response = SAFE_CALL(object, responseValue) 

Примечания Этой версии работает только с методами без каких-либо параметров.

Первоначально он был реализован как функция C, но это вызывает предупреждения при использовании ARC с ошибками performSelector. В качестве макроса препроцессора он работает точно так, как ожидалось.

1

Для достижения этой цели в быстры, я рекомендую следующее:

@objc protocol MyDelegate { 

optional func optionalMethod() 

} 

class MyClass : MyDelegate { 

// optionalMethod() does not have to be declared 

} 

Затем вызвать optional на вашем delegate объекта, простое использование if delegate.optionalMethod?(){}

Смежные вопросы