2010-11-22 11 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は私が最初にこのif文を使用 – choise

+1

あなたのデリゲートはNSOBject:@protocol XXX に準拠する必要があります – BenB

0

をチェックSAFE_CALLrespondToSelector:をチェックし、メソッドを呼び出します。

マクロがある:

#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のリークの警告が表示されます。プリプロセッサマクロとして、期待どおりに動作します。

@objc protocol MyDelegate { 

optional func optionalMethod() 

} 

class MyClass : MyDelegate { 

// optionalMethod() does not have to be declared 

} 

その後、あなたのdelegateオブジェクトにoptionalを呼び出すために、神は私のオハイオ州if delegate.optionalMethod?(){}

1

は迅速にこれを実現するために、私は次のようお勧めしますそれが応答しない場合は早期復帰し、次にこのメソッドのためにコピーしました。どのような愚かな間違い。ありがとう
関連する問題