1

我将两个 CCMenuItemImage 对象添加到 CCMenuItemToggle 中,如下所示:

CCMenuItemImage *soundEnabled = [CCMenuItemImage itemWithNormalImage:@"button_sound_enabled.png"
                                                       selectedImage:@"button_sound_enabled.png"];
soundEnabled.tag = kSoundEnabled;

CCMenuItemImage *soundDisabled = [CCMenuItemImage itemWithNormalImage:@"button_sound_disabled.png"
                                                        selectedImage:@"button_sound_disabled.png"];
soundDisabled .tag = kSoundDisabled;

CCMenuItemToggle *sound = [CCMenuItemToggle itemWithItems:[NSArray arrayWithObjects:soundEnabled,soundDisabled,nil] block:^(id sender) {
  CCMenuItem *item= ((CCMenuItemToggle*).sender).selectedItem;
  CCLog(@"item tag: %d",item.tag);
}];

kSoundEnabled并且kSoundDisabled是值为 2 和 3 的枚举项。当我在创建每个 CCMenuItemImage 后记录它们的标签时,一切都很好。但是当我将它们记录在块内时,标签显示为-1061138431。

此外,当我尝试将它们记录在块之外时,只是在我层的初始化代码中更进一步,它们开始出现错误。

有人知道这里有什么问题吗?这是一个支持 Kobold2d ARC 的项目,ARC 可能是这里的问题吗?我认为这不能解释像 NSInteger 这样的简单数据类型?

我知道我可以检查sender.selectedIndex = 0sender.selectedIndex = 1但我仍然想了解这里有什么问题。

4

1 回答 1

3

该问题并非来自 ARC 配置或其他配置。我用 Cocos2D 2.0 对其进行了测试,我遇到了同样的问题。我检查了来源,问题来自 CCMenuItemToggle,它更改了子项的标签以跟踪当前显示项。

我应该像这样在块中使用变量的引用:

CCMenuItemToggle *sound = [CCMenuItemToggle itemWithItems:[NSArray arrayWithObjects:soundEnabled,soundDisabled,nil] block:^(id sender)
{
  CCMenuItem *item= ((CCMenuItemToggle*).sender).selectedItem;
  if (item == soundEnabled)
  {
     //...
  } else
  {
     //...
  }
}];
于 2012-07-26T09:04:13.123 回答