0

我不完全理解如何在 obj-C 中使用委托模式。基本上我有一个类:DigGameControlLayer.h在它的标题中,我定义了protocol一个该类的所有用户都需要实现的必需方法。然后我创建delegate我在代码中使用的属性,就像任何其他属性一样,以委派moveObjectToPosition:方法应该做什么的责任。到目前为止一切顺利,我希望。

//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因为它是空的

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

2 回答 2

1

在 DigGoblinPlayer 中

实现方法

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

该方法会在 DigGameControlLayer 中调用该方法时调用

[self.delegate moveObjectToNewPosition:object atSpeed:moveSpeed];
于 2013-05-06T05:57:07.347 回答
1

您可以像这样在 init 方法中传递委托:

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

或者单独设置:

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

您选择哪种样式取决于您是否总是想要/需要委托,或者您是否希望以后能够更改/重置它。

在某些情况下,您不希望委托成为公共财产;那么您将使用第一种样式。

你可以在 iOS SDK 中看到很多这样的例子,比如这里

请注意——这self只是一个例子,当然也可以是其他对象——需要实现这个委托。name是我编造的。

于 2013-05-06T05:58:54.507 回答