我有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类中触发一个方法。
答案 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中的许多其他内容。