我在SpriteBuilder中创建了两个场景,一个是Shop,另一个是UpgradesNew。 Shop是CCNode层,UpgradesNew是CCNode层。我在MainScene中有两个CCScrollViews,分别加载Shop和UpgradesNew。
点击商店中的一个按钮时,UpgradesNew中的标签应更改颜色。我一直在尝试使用代理来实现它,但它不起作用。
这就是我做的......
在shop.h中我设置了协议:
@protocol changeColorProtocol <NSObject>
@required
-(void)changeColor;
@end
然后我设置了id
@property (nonatomic, retain) id <changeColorProtocol> delegate;
这是单击时应该使用changeColor的按钮。这是在shop.m
-(void) buyDiggerShibe {
[self.delegate changeColor];
[self didLoadFromCCB];
}
现在在UpgradesNew.h中我使用了这样的协议
@interface UpgradesNew : CCNode <changeColorProtocol>
在UpgradesNew.m
我在ViewDidLoad中将委托设置为self。
Shop *shop = [[Shop alloc]init];
shop.delegate = self;
-(void)changeColor {
if (hasDigger == YES) {
shovelRequires.color = [CCColor greenColor];
NSLog(@"HEY HEY HEY");
}
}
我可能将代理的某些部分放在错误的区域,因为我试图在它不工作时切换它们,我不确定它们应该去哪里。我看过多个委托教程,看起来过于复杂,至少我正在尝试做什么。
有什么想法吗?
编辑:
试过这个。
我在UpgradesNew中创建了一个属性
@property (strong, nonatomic) Shop *shop;
然后我在实现中合成它并在didLoadFromCCB中像这样分配它,而不是创建一个新对象:
self.shop = [[Shop alloc]init];
shop.delegate = self;
编辑:这就是我创建对象的方式。
将标签拖到图层中。 Identify it然后在标题中将其定义为CCLabelTTF *label;
就是这样,这就是我在图层上创建任何对象所做的一切。
要创建像Shop或UpgradesNew这样的图层,我点击New -> File -> Layer。这创建了一个新的CCNode。然后我设置了CCNode的类,如图所示,突出显示的CCNode具有一类MainScene。如果我想为该CCNode建立@property,我只需在自定义类下面的框中键入名称,并将其设置为doc root var,然后将其作为CCNode *MainScene
放在标题中。除此之外我什么都不做。
答案 0 :(得分:0)
我对SpriteBuilder一无所知,所以解决你的问题有点困难。您可能希望将SpriteBuilder添加到帖子的标题中,以便使用该框架的人可能会阅读它。
您需要解释如何创建2&#34; CCNode图层,以及如何将它们链接在一起。为了使一个对象具有另一个对象作为委托,必须在某处设置委托属性。设置在哪里?您是否在行
处设置了断点[self.delegate changeColor];
确保self.delegate
不是nil?
您是否在changeColor方法中设置了断点,或添加了日志语句,以查看它是否被调用?我的猜测是self.delegate是零,所以消息被丢弃在地板上(在Objective-C中将消息发送到nil是合法的。它只是没有做任何事情。)