cocos2dx 3.2在button回调函数里removeFromParent崩溃

cocos2dx 3.2在button回调函数里removeFromParent崩溃

void GameMenu::resumeBtnClicked(Ref *pSender, Widget::TouchEventType type)
{
if (Widget::TouchEventType::ENDED == type)
{
Director::getInstance()->resume();
this->removeFromParent();
}
}

如果我想要移除这个Menu 应该怎么处理呢?

一直都有这个问题 我也提过 没人鸟 实在不行就下一针移除吧

:4::4: 没升级的时候是好的 不过这个问题确实一直有
Director::getInstance()->resume();
CC_SAFE_RETAIN(this);//防止直接remove崩溃
this->removeFromParent();

这样解决吧~!

官方不表态 真是让人激火 :9:

已经修复了,等下个版本吧

这个问题很蛋疼啊,我也碰到了,加了个延迟删除来解决的,但是经常要这样干就很烦人:

this->setVisible(false);
auto act1 = DelayTime::create(0.1f);
auto act2 = CallFunc::create(=]() {
this->removeFromParent();
});
this->runAction(Sequence::create(act1,act2,nullptr));

在cocos Studio的movement事件中调用删除自己也会有同样问题。

请教2楼:用retain,事实上就没remove掉吧?

顺便请教楼主,用什么方法去调用你那个void GameMenu::resumeBtnClicked(Ref *pSender, Widget::TouchEventType type)
函数?目前我只能用lamda函数去做哈,相当于多绕了一个弯。

应该是没有删掉 不然就崩溃了。唉。后面更新解决吧

这样调用啊 很少直接写lamda 感觉不太友好 ,冏

Button *btnQuit = dynamic_cast<Button *>(root->getChildByName("quitbtn"));
btnQuit->addTouchEventListener(CC_CALLBACK_2(GameMenu::quitBtnClicked, this));

这个问题我断点看过 貌似是由于他在某些情况下,当触发UIWidget::releaseUpEvent()的时候,既存在新的_touchEventCallback,亦存在旧版的_touchEventListener& _touchEventSelector
然后你在_touchEventCallback的时候已经remove了自己.然后_touchEventListener& _touchEventSelector就会指针出错…
我做了如下修改。。

void Widget::releaseUpEvent()
{
if (_touchEventCallback) {
_touchEventCallback(this, TouchEventType::ENDED);

}else if(nullptr != _touchEventListener &&nullptr != _touchEventSelector){

(_touchEventListener->*_touchEventSelector)(this,TOUCH_EVENT_ENDED);

}
}

貌似就不会崩了…暂时没发现有什么副作用…

话说 为什么不同的人发问待遇不一样哩。。我老早就发了 根本没人鸟

下一个版本啥时候?期待更新,我也碰到了

如果不多的话直接setvisible 为false吧

button回调函数,你还在使用button这个对象
你在回掉里删除button,可能么!

删除方法有两种
1、使用延时
2、使用schedule

这不是更新能解决的问题,是你用错了的原因

这个问题到底是bug, 还是使用方法有问题, 求官方回答.

3。3 版本已经修复了

如何修复的, 有没有git代码变更可以看, 改了哪几行代码. 我想加到3.2上面.

— Begin quote from ____

引用第14楼jumpchess于2014-09-28 22:43发表的 回 13楼(bingwan) 的帖子 :
如何修复的, 有没有git代码变更可以看, 改了哪几行代码. 我想加到3.2上面. http://www.cocoachina.com/bbs/job.php?action=topost&tid=217352&pid=1066579

— End quote

在这个PR: https://github.com/cocos2d/cocos2d-x/pull/7567

测试参考 这个https://github.com/cocos2d/cocos2d-x/pull/7567 修复。

我也碰到了 解决办法是修改的他的底层 不知道可不可取?

我给出的解决方案:
DelayTime* delay = DelayTime::create(1);
Sprite* tmp = _icon;// 注意这里
CallFunc* callback = CallFunc::create(=](){
tmp->removeFromParent();
//_icon->removeFromParent();// 错误的写法,因为labdam捕获不到类的成员变量_icon
});
_icon->runAction(CCSequence::create(delay, callback, nullptr));