2

バグ/機能:

  1. スプライトを作成する
  2. 表示リストに追加します
  3. スプライトに REMOVED_FROM_STAGE リスナーを追加する
  4. スプライトを削除
  5. ハンドラー関数が間違って、まだ表示リストにあると報告する

これは、はるかに複雑なアプリケーションの一部として直面している問題ですが、ここではその基本に絞り込みました。REMOVED_FROM_STAGE のハンドラーが起動すると、currentTarget がまだ表示リストにあるように見えます。それと他のオブジェクトがこの関数内の表示リストにあるかどうかを検出できるようにする必要がありますが、ハンドラーが操作を完了するまで、currentTarget に関するすべての情報が正しくないように見えます。最初は、これはレンダリングまたはフレームの問題だと思っていましたが、私の出力では、実際には remove() コマンドの内部で発生する問題の方が問題であることが示されています。クラッジソリューションの不足で、誰かがなぜこれが起こるのかについての洞察を持っていますか?

import flash.display.Sprite;
import flash.events.Event;

var sprite:Sprite = new Sprite();
addChild(sprite);
sprite.addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);
removeChild(sprite);
output();// shows it has been removed. No parent, no stage

function removedFromStageHandler(event:Event):void{
        output();// Still in displaylist? Has parent and stage
}

function output():void{
    trace("object = " + sprite);
    trace("  parent = " + sprite.parent);
    trace("  stage = " + sprite.stage);
}

注: この奇妙な動作は ADDED_TO_STAGE には存在しません。これは、オブジェクトがハンドラー内でそのプロパティを正しく報告するためです。

4

1 に答える 1

1

アドビのドキュメントから:

removedFromStage イベント 表示オブジェクトが表示リストから削除されようとしているときに送出されます。詳細はこちら

したがって、意図された動作であり、アイテムがステージから削除される直前にイベントがディスパッチされ、ディスパッチが完了すると要素が削除されます。これにより、アイテムが削除される前にアクションを実行したり、条件によっては削除を防止したりすることができます。

于 2012-10-11T17:45:42.703 に答える