有没有办法检测从DisplayObjectContainer中删除子项的时间?我尝试重写removeChild(),但是当通过将子项添加到另一个容器(通过在新容器上调用addChild())删除子项时,这似乎不会触发。我不知道任何触发事件......
我知道您可以使用更高级别的Flex类来执行此操作,但我正在使用Pure AS3项目。
答案 0 :(得分:5)
<强>更新强>
正如Roy在评论中指出的那样,因为事件(包括Event.REMOVED)bubble up,然后简单地将REMOVED事件的事件监听器添加到DisplayObjectContainer
就足够了;当从容器中移除任何子对象时,它将被调用(即使它是因为该对象被添加到另一个容器中)。
事件的target
属性将是要删除的子项,currentTarget
将始终是容器本身。
请注意,如果整个容器本身已从其容器中删除,则此事件也会触发;一个简单的if (e.target == e.currentTarget) return;
应该处理这种情况。
以下原始答案:
您可以为添加到DisplayObject
的每个DisplayObjectContainer
添加Event.REMOVED
event的事件监听器。然后,对象本身会告诉您它已被删除,而不必依赖DisplayObjectContainer
进行通知。
如果在将对象从一个容器移动到另一个容器时也不会触发,那么作为一种变通方法,您还可以侦听ADDED事件,并在触发时检查显示对象是否仍在容器中。
一旦从容器中删除对象,不要忘记删除事件侦听器,否则最终会导致内存泄漏,对同一对象的事件侦听器的多次调用等。
答案 1 :(得分:-1)
只要孩子在舞台上,你就可以听Event.REMOVED_FROM_STAGE
。此示例跟踪“删除”。
private function init():void {
var parent:Sprite = new Sprite();
var test:Sprite = new Sprite();
test.addEventListener(Event.REMOVED_FROM_STAGE, remove);
parent.addChild(test);
stage.addChild(parent);
parent.removeChild(test);
}
private function remove(e:Event):void {
trace("remove");
}