不要试图将“知识”引入对象,只是为了传递消息。我的意思是,如果你有你的ObjectBody,HudLayer和MainSetupScene对象(我将在这里做一些假设),这样设计...
MainSetupScene“拥有”HudLayer(为此,你大概在MainSetupScene [self addChild:hudLayer];
)
MainSetupScene没有 “拥有” ObjectBody(同样,你可能在MainSetupScene [self addChild:objectBody];
与hudLayer一样)
现在,你想objectBody为 “沟通”。不要试图强迫对象的知识,反之亦然。只需使用代表。
因此,举例来说,在你objectBody你可以声明如下
@protocol ObjectBodyDelegate
-(void)objectBodyStateChanged;
@end
现在,您mainsetupscene会有它的定义为
@interface MainSetupScene : CCScene<ObjectBodyDelegate>
...
现在,在您ObjectBody类,当你想发送消息给hud,使用代理[delegate objectBodyStateChanged];
这将由您的MainSetupScene处理。然后这将决定通过调用相关方法并设置适当的值(它可以从objectBody中获取)来更新HUDLayer。
总之,身体告诉现场发生了一些事情,使其发生变化。现场知道需要更新哪些内容以反映这一变化。身体不应该知道这个hud存在,并且hud不应该知道身体存在。
除了我在这里放置的代表,还有更多的代表,但是如果你四处搜寻,你会发现很多细节。
EDIT AFTER COMMENT 你的协议是在一类(类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类的.h你必须
@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中的其他许多功能。
看来你确实设计了正确的架构。你应该使用协议或继承来反映你的对象的不同“角色” – 2012-03-09 10:27:41
就像Nick Bull在下面说的那样? – Bek 2012-03-09 14:21:57