不同类的访问方法

时间:2012-03-09 10:20:51

标签: iphone objective-c cocos2d-iphone

我有3个类,ObjectBody(BodyNode),MainSetupScene(CCLayer)和HudLayer(CCLayer)

我在MainSetupScene中设置了ObjectBody和HudLayer,这是它工作的要求。

我现在要做的是添加一个方法,其中ObjectBody获得访问HudLayer的权限,因此ObjectBody可以访问在HudLayer中创建的方法。

3个要点
-ObjectBody是一个BodyNode类 - 我想要访问的方法是位于HudLayer中的 - (void) -ObjectBody是一个b2Body,它在检测到碰撞时调用HudLayer中的方法。

我做了一些研究,我遇到了这个,我尝试在我的ObjectBody中设置这段代码

HudLayer *hud = [[hud alloc] init];
[self addChild:hud];
[hud NameOfTheMethod];

然而,BodyNode类不接受HudLayer作为子级。

简而言之,我试图让一个BodyNode类在CCLayer类中触发一个方法。

1 个答案:

答案 0 :(得分:1)

不要试图将“知识”引入对象,只是为了传递消息。我的意思是,如果你有你的ObjectBody,HudLayer和MainSetupScene对象(我将在这里做一些假设)设计为......

MainSetupScene“拥有”HudLayer(为此,您可能在MainSetupScene [self addChild:hudLayer];中执行了此操作)

MainSetupScene“拥有”ObjectBody(再次,你可能在MainSetupScene [self addChild:objectBody];中完成了)

现在,您希望objectBody与hudLayer“通信”。不要试图强迫hudlayer知道对象体,反之亦然。只需使用代表。

因此,例如,在您的objectBody中,您可以声明以下内容

@protocol ObjectBodyDelegate
-(void)objectBodyStateChanged;
@end

现在,您的mainsetupscene将其定义为

@interface MainSetupScene : CCScene<ObjectBodyDelegate>
...

现在在您的ObjectBody类中,当您想要向hud发送消息时,请使用委托[delegate objectBodyStateChanged];

您的MainSetupScene将处理哪个。然后,这将决定通过调用相关方法并设置适当的值(它可以从objectBody获取)来更新HUDLayer。

简而言之,身体告诉现场发生了一些事情以使其发生变化。然后,场景知道需要更新哪些内容以反映该更改。身体不应该知道hud存在,并且hud不应该知道身体存在。

实施代表的内容比我在这里提出的要多,但如果你四处搜索,你会发现很多细节。

评论后编辑 您的协议是在一个类(A类)的接口中定义的,但实现是在另一个类(B类)中编写的。这就是为什么它被称为委托 - 你将工作委托给另一个类。

您还需要定义和设置委托。所以,在A .h你有

@protocol ClassADelegate
-(void)doSomethingAfterSomethingChanged;
@end

@interface ClassA {
id <ClassADelegate> delegate;
}
@property (nonatomic, retain) id<ClassADelegate> delegate;

在A类.m实施中,你有

@implementation ClassA {
@synthesize delegate;

-(void)changeSomething {
... Do whatever you need to do ...
// Now call the delegate
[delegate doSomethingAfterSomethingChanged];
}

在B班。你有

@interface ClassB<ClassADelegate> {
}

然后在.m实现中,你有

@implementation ClassB {
-(id)init {
   .. Do whatever, but when you create your ClassA, set this as delegate ...
   ClassA myClassA = [[ClassA alloc] init];
   myClassA.delegate = self;
}

-(void)doSomethingAfterSomethingChanged {
// This gets called by ClassA
}

有很多关于代表的更好的教程可以解释它比这更好。希望这会让它更清晰一些。您可能已经使用了UITableView控件的代理以及iOS SDK中的许多其他内容。