4

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

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

导致它的行是

skillsMenu.isTouchEnabled = YES;

skillsMenu只是一个CCMenu。我喜欢经常使用上面的行启用/禁用它。

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

也许一开始就使用那条线是错误的。没有更好的方法来启用/禁用 aCCMenu吗?

cocos2d-iphone 1.0.1

4

2 回答 2

8

isTouchEnabled注册/注销对象的触摸处理程序。

在同一步骤中注册和注销触摸处理程序在过去曾引起过问题,尽管在最近的版本中,我相信这已得到解决。

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

-(void) modifyMenu:(CCMenu*) menu withEnabledValue:(BOOL) enabled
{
    CCMenuItem *menuItem;
    CCARRAY_FOREACH(menu.children, menuItem)
    {
        [menuItem setIsEnabled: enabled ];
    }
}
于 2012-12-01T02:28:16.373 回答
2

CCMenu 有一个 .enabled 属性(可设置),请改用它。与 isTouchEnabled 的不同之处在于菜单未从触摸调度程序注册/注销。相反,当 myMenu.enabled 为 false 时,触摸在 CCMenu 的 ccTouchBegan 委托方法中从一开始就被忽略。这更干净,并且避免了使用 isTouchEnabled 的陷阱(这是 CCLayer 类的属性,CCMenu 扩展了它)。

于 2012-12-01T04:14:41.177 回答