引擎removeChild有BUG,移除后的子对象,无法再加事件

removeChild后无法再加事件
const element = this._mapItemList[index].node;
element.parent.removeChild(element);
element.active = false;

this.previewScrollView.content.addChild(item);
item.active = true;
item.on(cc.Node.EventType.TOUCH_END, this.onMapItemClick, this);

后续添加的点击事件,会无法触发

你这个item哪里来的?还有,remove后子节点会被销毁啊

每行代码我都能看懂,组合起来我就看不懂了 :thinking:

代码不完整也看不出来什么啊this.previewScrollView.content 和element.parent是什么节点

并不会被销毁, 你自己试一下就知道了, 渲染是可以的,后续事件无法添加, 只需要连续这么写就行了, 单纯的 对象池操作而已,

跟节点无关系,就是同一个Node添加, 对象池操作, 同步操作会出现问题, 感觉底层的移除是异步的,同步立马添加事件, 会被异步的移除给去除掉, 渲染是正确的, 只是点击事件无法再被添加

我虽然能看懂过程,但按你说的 如果你认为处理过程正确 但结果始终不对的情况,那就是COCOS 本身有很多限制导致的 你认为可以这样,但内部就不允许,所以可能不是你的问题就 2.X官方基本不维护了 连答疑都没有了,很难办

你得说说具体的版本号。
然后我建议你把
element.active = false;
item.active = true;
两句删除。
element.parent.removeChild(element);修改为element.parent = null;
再试试

element.removeFromParent()这样写不好么

不知道你接触Cocos多久了,但凡接触Cocos久点的人,基本上都能判断出这是因为引擎的机制问题导致的,节点的移除和销毁类似这样的等等操作,都会在下一帧进行处理,你同步移除再添加,下一帧执行了节点移除的相关操作,你注册的事件大概率就是这么被移除掉的,这事引擎由来已久的机制。

remove不会销毁啊, 只是挂起, 切场景后才会销毁非常驻节点

豆包骗我 :rofl:

引擎底层代码 AI肯定不知道的,他会胡乱回答的

其实见名思意了,如果销毁的话destroy这个方法就没意义了。很少用remove,确切讲,没用过。哈哈

不懂想请教一下,严格来说移除貌似是在本帧逻辑帧结束执行的,那 addChild 是啥时候执行的呢?如果直接同步写先移除再添加同一个节点,中间是个什么逻辑 :thinking:

如果是对象池,直接使用nodePool 的API接口就好了,如果是自己写的对象池组件的话,重新setparent就可以,remove之后会有onDestory 和onDisable的操作会在下一帧执行,监听的消息就会出问题,建议是自己在item上添加组件,并添加类型init方法,添加事件,onDestory 或者 自己创建clear方法注销事件

我觉得这个是个BUG, 异步移除,那事件就不该是同步添加, 这个是设计的问题,