Iphone 不同类中的访问方法

Iphone 不同类中的访问方法,iphone,objective-c,cocos2d-iphone,Iphone,Objective C,Cocos2d Iphone,我有3个类,ObjectBody(BodyNode)、MainSetupScene(CCLayer)和HudLayer(CCLayer) 我已经在我的主设置场景中设置了ObjectBody和HudLayer,这是它工作的要求 我现在要做的是添加一个方法,其中ObjectBody获得访问HudLayer的权限,因此ObjectBody可以访问在HudLayer中创建的方法 3个要点 -ObjectBody是BodyNode类。 -我试图访问的方法是-(void)位于图层中。 -ObjectBody

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

我已经在我的主设置场景中设置了ObjectBody和HudLayer,这是它工作的要求

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

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

我做了一些研究,发现了这个问题,我尝试在我的ObjectBody中设置这个代码

HudLayer *hud = [[hud alloc] init];
[self addChild:hud];
[hud NameOfTheMethod];
但是,BodyNode类不接受HudLayer作为子级

简言之,我试图使BodyNode类触发CCLayer类中的方法。

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

MainSetupScene“拥有”HudLayer(为此,您可能在MainSetupScene
[self addChild:HudLayer];

MainSetupScene“拥有”ObjectBody(同样,您可能在MainSetupScene
[self-addChild:ObjectBody];
中拥有)

现在,您希望objectBody与hudLayer“通信”。不要试图将hudlayer的知识强加给objectbody,反之亦然。只需使用代理即可

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

@protocol ObjectBodyDelegate
-(void)objectBodyStateChanged;
@end
现在,主设置场景的定义为

@interface MainSetupScene : CCScene<ObjectBodyDelegate>
...
在类A.m实现中,您将

@protocol ClassADelegate
-(void)doSomethingAfterSomethingChanged;
@end

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

-(void)changeSomething {
... Do whatever you need to do ...
// Now call the delegate
[delegate doSomethingAfterSomethingChanged];
}
@interface ClassB<ClassADelegate> {
}
@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
}
在B.h班,你会

@protocol ClassADelegate
-(void)doSomethingAfterSomethingChanged;
@end

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

-(void)changeSomething {
... Do whatever you need to do ...
// Now call the delegate
[delegate doSomethingAfterSomethingChanged];
}
@interface ClassB<ClassADelegate> {
}
@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中的许多其他内容一起使用。

看来您确实正确地设计了架构。您应该使用协议或继承来反映对象的不同“角色”,如Nick Bull下面所说的?这非常有用,我所要做的就是在my.h中声明协议,然后在@interface中实现它们,对吗?NSCoding也是协议实现的一部分吗?因为他们似乎有关联。抱歉占用您的时间。另一个问题是,我的主设置场景中只有[self-addChild:hudLayer]。该对象将被设置在另一个类中,该类决定了我在[self-addChild:placementLayer]中放置的对象(按级别)的位置MainSetupScene@Bek请参阅更新的答案,了解更多代表的解释。非常感谢您抽出时间,非常感谢。我试着阅读苹果文档并搜索一些教程。你的解释正中要害,帮了我大忙。祝你有美好的一天!我遇到了另一个问题,我做了你在这里描述的事情。ObjectBody=ClassA,而SetupClass=ClassB。我必须将ObjectBody.h导入SetupClass才能访问在对象体中创建的委托。但是,每当我这样做时,它都会给我一条错误消息,说“找不到”BodyNode“的接口声明”,这是“ObjectBody”的超类。(只有当我将头导入SetupClass时才会发生此错误)