Способ обнаружить, когда ребенок удален из DisplayObjectContainer? - PullRequest
0 голосов
/ 14 марта 2011

Есть ли способ определить, когда дочерний элемент удален из DisplayObjectContainer? Я попытался переопределить removeChild (), но, похоже, это не срабатывает, когда дочерний элемент удаляется, добавляя его в другой контейнер (через вызов addChild () в новом контейнере). Я не знаю ни о каких событиях, которые вызывают, либо ...

Я знаю, что вы можете сделать это с высокоуровневыми классами Flex, но я использую проект Pure AS3.

Ответы [ 2 ]

5 голосов
/ 14 марта 2011

Обновление:
Как указал Рой в комментариях, потому что события (включая Event.REMOVED) всплывают , затем просто добавляется прослушиватель событий для события REMOVEDдо DisplayObjectContainer достаточно;он вызывается, когда любые дочерние объекты удаляются из контейнера (даже если это происходит из-за того, что объект был добавлен в другой контейнер).

Свойство target события будет дочерним объектом, который удаляется, иcurrentTarget всегда будет сам контейнер.

Обратите внимание, что это событие также будет запускаться, если весь контейнер удален из его контейнера;простой if (e.target == e.currentTarget) return; должен обрабатывать этот случай.

Оригинальный ответ ниже:


Вы можете добавить прослушиватель событий для Event.REMOVED события для каждого DisplayObject, которое добавляется к вашему DisplayObjectContainer.Затем сам объект скажет вам, что он был удален, вместо того, чтобы полагаться на DisplayObjectContainer для уведомлений.

Если это также не срабатывает при перемещении объекта из одного контейнера в другой, тоВ качестве обходного пути вы также можете прослушать событие ADDED и проверить, находится ли экранный объект в вашем контейнере во время его запуска.

Не забудьте удалить прослушиватели событий после удаления объекта из вашего контейнера,в противном случае возможны утечки памяти, многократные вызовы прослушивателей событий для одного и того же объекта и т. д.

0 голосов
/ 14 марта 2011

Пока ребенок находится на сцене, вы можете слушать 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...