如何通知孩子的父母班级?

时间:2013-04-25 15:25:52

标签: model-view-controller cocos2d-iphone key-value-observing

我正在尝试解决一个架构问题,但我想找到最合适的方法。

我有游戏场景GameLayer.h,这是我在这种情况下的观点。我还有GameEngine类,我正试图成为控制器。 我有我的自定义Egg类派生自CCNode和一些计时器逻辑通过Egg类中的计划实现。 我通过addChild方法在游戏场景中添加了许多Egg对象。 所以GameEngine.m导入GameLayer.h,而GameLayer.m导入Egg.h

每个Egg中的计时器用完后,我想收到通知,即运行一些动作,增加分数等。 问题是实施这种情况的最佳方式是什么。我也想遵守MVC规则 我想到的快速解决方案是

  1. 在Egg类中包含Gamelayer.h并在其中调用一些更新方法。更新视图(自我)并通知GameEngine以保存新分数。
  2. 在Egg类中包含Gamelayer.h并在其中调用一些更新方法。在update方法中调用另一个更新方法,现在在GameEngine.h中,现在从GameEngine保存得分,并更新Gamelayer(视图)
  3. 实施KVO。问题是我之前从未做过,我不知道观察者应该是GameLayer还是GameEngine
  4. 请帮忙,感谢任何例子

1 个答案:

答案 0 :(得分:1)

更多选项:

1。 使用NSNotificationCenter。你的鸡蛋会发布通知,你的GameLayer会观察。

2。 使用protocol。例如:

// in Egg.h

@class Egg;
@protocol EggDelegate
// an example method
-(void)egg:(Egg *)egg hadSomethingHappen:(int)parameter;
@end

@interface Egg: CCNode
@property (weak) id<EggDelegate> delegate;
@end

// in Egg.m
/// something happened and delegate has to be notified?
[self.delegate egg:self hadSomethingHappen:someNumber];

然后宣布GameLayer支持该协议:

@interface GameLayer : CCLayer <EggDelegate>

在GameLayer中实现协议的方法,并使其成为Egg对象的委托:

// somewhere in GameLayer
Egg *egg = [Egg node];
egg.delegate = self;

...

//protocol implementation
-(void)egg:(Egg *)egg hadSomethingHappen:(int)parameter
{
// do something
}