CCControlButton crashes when calling setBackgroundSpriteForState

Hi folks,

I’ve discovered what I think is a problem with the CCControlButton implementation. When you try to update the background sprite it dies when attempting to reset the layout. For example:

CCControlButton *button = CCControlButton::create(...); //... CCScale9Sprite *sprite = CCScale9Sprite::create("newBackground.png"); myButton->setBackgroundSpriteForState(sprite, CCControlStateNormal);

^ that causes a crash when CCControlButton::needsLayout() is called. It looks like the member m_backgroundSprite is not getting set as expected, even though this line looks like it’s attempting to do so:
m_backgroundSpriteDispatchTable->setObject(sprite, state);

Anybody else having this issue?

Thanks!

Ben

I discovered this problem too. I think the problem is m_backgroundSprite not retain in CCControlButton when assigning.

This is still an issue in cocos2d-2.0-x-2.0.2. I’ve found the fix is to add “m_backgroundSprite = sprite;” to line 462 of CCControlButton.cpp.

Ben

`BenWard Thanks for this post, but setting “m_backgroundSprite = sprite” in that line does not look right.

You have to make changes in CCControlButton.h / CCControlButton.cpp

`CC_SYNTHESIZE_RETAIN(CCScale9Sprite**, m_backgroundSprite, BackgroundSprite);
// CCScale9Sprite** m_backgroundSprite;@

and in the implementation all calls for

m_backgroundSprite = …. -> setBackgroundSprite(…)

and at CCControlButton::~CCControlButton()

CC_SAFE_RELEASE(m_backgroundSprite);