Make a Menu Callback with the CocosBuilder

Cocos2d-x version is 2.1.2
CocosBuilder version is 3.0

I create the Demo program with VS2010, and use CocosBuilder’s default project resource 『Hello CocosBuilder』.
And everything is fine until I want to make a callback function to terminate the program — You know, CocosBuilder default project couldn’t terminate itself.
I make MainBoardScene generate from cocos2d::extension::CCBSelectorResolver, and implement the virtual function onResolveCCBCCMenuItemSelector, add a break point at onResolveCCBCCMenuItemSelector, but it was never called.

cocos2d::SEL_MenuHandler MainBoardScene::onResolveCCBCCMenuItemSelector( CCObject * pTarget, const char* pSelectorName )
{
    CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "onPressButton", MainBoardScene::onPressButton);
    return NULL;
}

I find output window logged the message: Skipping selector ‘onPressButton’ since no CCBSelectorResolver is present., then I trace the source code which print the message:

BlockData * CCNodeLoader::parsePropTypeBlock(CCNode * pNode, CCNode * pParent, CCBReader * pCCBReader) {
    std::string selectorName = pCCBReader->readCachedString();
    int selectorTarget = pCCBReader->readInt(false);

    if(selectorTarget != kCCBTargetTypeNone) {
        CCObject * target = NULL;
        if(!pCCBReader->isJSControlled()) {

            if(selectorTarget == kCCBTargetTypeDocumentRoot) {
                target = pCCBReader->getAnimationManager()->getRootNode();
            } else if(selectorTarget == kCCBTargetTypeOwner) {
                target = pCCBReader->getOwner();
            }

            if(target != NULL) {
                if(selectorName.length() > 0) {
                    SEL_MenuHandler selMenuHandler = 0;

                    CCBSelectorResolver * targetAsCCBSelectorResolver = dynamic_cast(target);

                    if(targetAsCCBSelectorResolver != NULL) {
                        selMenuHandler = targetAsCCBSelectorResolver->onResolveCCBCCMenuItemSelector(target, selectorName.c_str());
                    }
                    if(selMenuHandler == 0) {
                        CCBSelectorResolver * ccbSelectorResolver = pCCBReader->getCCBSelectorResolver();
                        if(ccbSelectorResolver != NULL) {
                            selMenuHandler = ccbSelectorResolver->onResolveCCBCCMenuItemSelector(target, selectorName.c_str());
                        }
                    }

                    if(selMenuHandler == 0) {
                        CCLOG("Skipping selector '%s' since no CCBSelectorResolver is present.", selectorName.c_str());
                    } else {
                        BlockData * blockData = new BlockData();
                        blockData->mSELMenuHandler = selMenuHandler;

                        blockData->mTarget = target;

                        return blockData;
                    }
                } else {
                    CCLOG("Unexpected empty selector.");
                }
            } else {
                CCLOG("Unexpected NULL target for selector.");
            }
        } else {
            if(selectorTarget == kCCBTargetTypeDocumentRoot) {
                pCCBReader->addDocumentCallbackNode(pNode);
                pCCBReader->addDocumentCallbackName(selectorName);

            } else {
                pCCBReader->addOwnerCallbackNode(pNode);
                pCCBReader->addOwnerCallbackName(selectorName);
            }
        }
    }

    return NULL;
}

CCBSelectorResolver targetAsCCBSelectorResolver = dynamic_cast<CCBSelectorResolver *>(target);* the targetAsCCBSelectorResolver was NULL, and after CCBSelectorResolver ccbSelectorResolver = pCCBReader->getCCBSelectorResolver();* ccbSelectorResolver is NULL too.

In CocosBuilder, I set “onPressButton” in the CCMenuItem’s selector and Target is Document root

Is there any important step I forgot to do in CocosBuilder, or just make a wrong step?

I find the reason:

Set the Target property of CCMenuItem to Owner(In CocosBuilder, I don’t know how to upload a picture:( )

:slight_smile: