【问题标题】:Changing label color of a label in a different view (delegates?) [Spritebuilder]在不同的视图中更改标签的标签颜色(代表?)[Spritebuilder]
【发布时间】:2014-07-25 18:57:40
【问题描述】:

我在 SpriteBuilder 中制作了两个场景,一个是 Shop,另一个是 UpgradesNew。 Shop 是一个 CCNode 层,UpgradesNew 是一个 CCNode 层。我在 MainScene 中有两个 CCScrollView,分别加载 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 放在标题中。除此之外,我什么都不做。

【问题讨论】:

  • 这是解决您昨天发布的同一问题的另一种方法,但未能提供清晰、有意义的信息来帮助回答您的问题?
  • @nhgrif 是的,因为每个人都停止回复了,所以我试图找到解决方案。我看不出您还需要什么其他信息。初始化是通过 SpriteBuilder 完成的。我把我的其他类似问题放在前面,大多数人都能提供帮助。
  • 这段代码和昨天有完全相同的问题。您不是使用对现有对象的引用,而是创建一个新对象并使用它。昨天你在新对象上调用了一个方法——今天你试图将新对象设置为委托。
  • 您需要学习一些非常简单的 OOP 教程。你的问题很明显——即使你承认你知道问题出在哪里,但是因为你对 OOP 概念的理解不够好,你甚至不知道在你的问题中包含什么才能让别人输入你的代码需要复制粘贴到您的项目中。
  • @nhgrif 我更新了原帖

标签: ios objective-c cocos2d-iphone delegates


【解决方案1】:

我对SpriteBuilder一无所知,所以很难回答你的问题。您可能希望将 SpriteBuilder 添加到帖子的标题中,以便使用该框架的人可能会阅读它。

您需要解释这 2 个“CCNode 层”是如何创建的,以及如何将它们链接在一起。为了让一个对象拥有另一个对象作为委托,必须在某处设置委托属性。该设置在哪里进行?你有没有在该行设置断点

[self.delegate changeColor];

要确保self.delegate 不为零?

您是否在 changeColor 方法中设置了断点,或者添加了日志语句,以查看它是否被调用?我的猜测是 self.delegate 为 nil,因此消息被丢弃在地板上(在 Objective-C 中向 nil 发送消息是合法的。它只是没有做任何事情。)

【讨论】:

  • 邓肯,这不是零:Shop *shop = [[Shop alloc]init]; shop.delegate = self;。问题很明显,对吧?他昨天也有同样的问题:stackoverflow.com/questions/24025776/…
  • 是的,它没有被调用,我在那里有一个 NSLog。我更新了我的帖子,而不是创建一个新对象,而是引用了已经存在的 Shop(希望这样做正确)。由于我使用的是 SpriteBuilder,而且我对 obj-c 还是很陌生,老实说,我不知道 SB 把它用来创建图层的东西放在哪里。
  • Albert,解决我在回答中要求的其他内容。
  • 根据 nhgrif 对您的另一篇文章的引用,听起来您正在创建一个新的 Shop 对象并在其上设置委托,而不是在现有的 Shop 对象上。不要放弃关于同一主题的另一个问题并开始一个新线程。当更有经验的人向您提供信息时,请继续关注它,并在同一个线程中跟进。否则,您将失去对最能帮助您的人的善意。
  • 委托属性在 UpgradeNew 的 didLoadFromCCB 中设置为shop.delegate = self; 将两者联系在一起,这就是我现在所坚持的。我发现我(认为)我需要在各自的类中声明两个 CCNode 的 @property。在编辑代码中,我在 UpgradesNew 标头而不是 Shop 标头中有 @property (nonatomic, retain) Shop *shop;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多