Cocos2d iphone 启用/禁用CCMenu对象的更好方法

Cocos2d iphone 启用/禁用CCMenu对象的更好方法,cocos2d-iphone,Cocos2d Iphone,*在-[CCTouchDispatcher forceAddHandler:array:]、/libs/cocos2d/Platforms/iOS/CCTouchDispatcher.m:108中断言失败 *由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“委托已添加到” 触摸按钮。 引起它的线是 skillsMenu.isTouchEnabled = YES; skillsMenu只是一个CCMenu。我喜欢经常使用上面的行来启用/禁

*在-[CCTouchDispatcher forceAddHandler:array:]、/libs/cocos2d/Platforms/iOS/CCTouchDispatcher.m:108中断言失败

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“委托已添加到” 触摸按钮。

引起它的线是

skillsMenu.isTouchEnabled = YES;
skillsMenu
只是一个
CCMenu
。我喜欢经常使用上面的行来启用/禁用它

问题是,我不知道如何正确解释这个错误-我不知道为什么设置这个属性会导致这样的错误

也许一开始使用这句话是错误的。是否有更好的方法来启用/禁用
CCMenu


cocos2d iphone 1.0.1

iTouchEnabled
注册/取消注册对象的触摸处理程序

在同一步骤中注册和注销触摸处理程序在过去曾导致过问题,尽管在最近的版本中,我相信这已经得到了修复

在任何情况下,如果您只是想临时启用/禁用菜单,则启用/禁用单个菜单项的问题会更小:

-(void) modifyMenu:(CCMenu*) menu withEnabledValue:(BOOL) enabled
{
    CCMenuItem *menuItem;
    CCARRAY_FOREACH(menu.children, menuItem)
    {
        [menuItem setIsEnabled: enabled ];
    }
}

CCMenu有一个.enabled属性(可设置),请改用该属性。iTouchEnabled与iTouchEnabled的区别在于菜单未从触摸调度器注册/注销。相反,当myMenu.enabled为false时,在CCMenu的cctouchBegind委托方法中,从一开始就忽略触摸。这更干净,避免了玩iStochenabled(这是CCMenus扩展的CCLayer类的一个属性)的陷阱。

似乎我还没有足够的代表对其他答案发表评论,但我想指出@YvesLeBorg的答案对Cocos2d iphone 1.x无效,这是OP询问的版本。但是,它对Cocos2d iphone 2.x有效。我在Cocos2d 2.1上使用此解决方案,menuItem继续启用。我根本找不到此.enabled属性:(嗯……这是一部2.0经典之作!我回答得太快了。在你去之前,我会看看上面马克的答案。要么从外面看进去,要么子类化/修改CCMenu,无论哪个在你的上下文中是有意义的。touchEnabled在当前2.1x版本的CoCoCoS2D iphone中似乎非常有问题。如果我打开/关闭/打开等等,过一段时间尽管最后一个电话接通了,它还是不响。