2013-05-06 87 views
0

我不完全理解如何在obj-C中使用委託模式。基本上我有一個類:DigGameControlLayer.h,在它的標題中,我定義了一個,這個類需要所有用戶都需要實現的方法。然後,我創建了delegate屬性,我在代碼中使用該屬性,就像任何其他屬性一樣,委託moveObjectToPosition:方法應該執行的操作。到目前爲止,我希望這麼好。Objective-C:初始化代理的位置

//DigGameControlLayer.h 
@protocol DigGameControlLayerDelegate <NSObject> 
-(void) moveObjectToNewPosition: (CCSprite *)object atSpeed:(float)moveSpeed; 
@end 

@property (assign) id <DigGameControlLayerDelegate> delegate; 

然後就是使用類(在這種情況下DigCharacter)類的說,它附着在DigGameControlDelegate協議

@interface DigGoblinPlayer : DigCharacter <DigGameControlLayerDelegate> 

但是我不明白的是我在哪裏可以初始化和設置delegate屬性聲明?原因目前它什麼也不做,當我使用它在DigGameControlLayer因爲it's空

[self.delegate moveObjectToNewPosition:object atSpeed:moveSpeed]; 

回答

1

您可以通過delega TE在init方法,像這樣:

DigGoblinPlayer* player; 
player = [[DigGoblinPlayer alloc] initWithName:(NSString*)name delegate:self]; 

或單獨設置:

DigGoblinPlayer* player; 
player = [[DigGoblinPlayer alloc] initWithName:(NSString*)name]; 
player.delegate = self; 

你選擇哪種樣式取決於如果你總是希望/需要一個委託,或者如果你希望能夠稍後更改/重置。

在某些情況下,您不希望委託人成爲公共財產;那麼你會使用第一種風格。

你在iOS SDK中看到很多這樣的例子,如here

請注意,self - 這只是一個例子,當然還有其他的對象 - 需要實現這個委託。而name是我編造的東西。

+0

現在就工作,謝謝!最後,我瞭解了代表團模式 - 我不知道爲什麼它很難理解。 – 2013-05-06 06:13:20

1

在DigGoblinPlayer

實現方法

-(void) moveObjectToNewPosition: (CCSprite *)object atSpeed:(float)moveSpeed 
{ 
} 

當方法DigGameControlLayer調用此方法將被調用

[self.delegate moveObjectToNewPosition:object atSpeed:moveSpeed];