0

したがって、このようにコンテナからすべての子を簡単に削除する方法があります

while (container.numChildren)
{
    container.removeChildAt(0);
}

複数形でstage.eventListenerを削除する方法はありますか(正しい単語を使用しているかどうかはわかりません)、stage.eventListenersのようなものですか? そんな感じ?

ありがとう!

4

4 に答える 4

3

いいえ、ありません。イベントリスナーを追跡するメカニズムは、少なくとも公的に利用可能です。ただし、自分で行うこともできます。

基本的に、追加された各リスナーを追跡する必要があります。最も簡単な方法は、これを実行したいクラスを拡張してオーバーライドすることですaddEventListener()

private var listeners:Vector.<Object>;

override public function addEventListener( type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ):void {
    var obj:Object = {
        type : type,
        listener : listener
    };
    this.listeners.push( obj );
    super.addEventListener( type, listener, useCapture, priority, useWeakReference );
}

override public function removeEventListener( type:String, listener:Function, useCapture:Boolean = false ):void {
    var i:Number, l:Number;
    l = this.listeners.length;

    for ( i = 0; i < l; i++ ) {
        if ( this.listeners[i].type == type && this.listeners[i].listener == listener ) {
            this.listeners.splice( i, 1 );
            break;
        }
    }

    super.removeEventListener( type, listener, useCapture );
}

public function removeAllEventListeners():void {
    var i:Number, l:Number;
    l = this.listeners.length;

    for ( i = 0; i < l; i++ ) {
        super.removeEventListener( this.listeners[i].type, this.listeners[i].listener );
    }
    this.listeners.splice( 0, this.listeners.length ); //empties the vector
}

クラスを拡張するオプションがない場合 (タイムラインで Flash Pro を使用している場合、またはすべてのイベント リスナーを削除する必要があるステージである場合)、イベントを追加するたびに手動でベクターに追加できます。リスナー。上で説明した方法ほど単純ではありませんが、それでも機能します。

useCaptureおそらく、保存されているオブジェクトにプロパティを追加し、それも確認する必要があることに注意してください。

于 2013-02-14T18:22:05.037 に答える
0

残念ながら、簡単な答えはそれが不可能であるということです。デフォルトでは、イベントディスパッチャは、登録されているリスナーを公に追跡しません。したがって、一部のリストをループしてすべてを削除することはできません。

自分で追加したリスナーを覚えておく必要があります。

于 2013-02-14T18:21:31.460 に答える
0

非常に簡単な解決策があります。Robert Penner の驚異的な Signals ライブラリです。次に例を示します。

import org.osflash.signal.Signal;

public class Rocket()
{
    //  Signals are used to dispatch messages to interested parties
    public var enginesFiredSignal:Signal;
    public function Rocket()
    {
        //  You have to instantiate the signal for it to do anything
        enginesFiredSignal = new Signal();
    }

    public function fireEngines():void
    {
        //  Dispatch will notify any interested parties
        enginesFiredSignal.dispatch();
    }

    public function dispose():void
    {
        //  This is the magic call... it removes *all* interested parties.
        //  No need to iterate through them and removeEventListeners.
        enginesFiredSignal.removeAll();
    }
}

public class Academy()
{
    public var rocket:Rocket;
    public function Academy()
    {
        rocket = new Rocket();
        //  We are interested to know *when* the engines fire,
        //  so we "add" ourself to the Signal.
        rocket.enginesFiredSignal.add( enginesFiredHandler );
        //  This call will force the Signal to do its thing
        rocket.fireEngines();
        //  Disposing of the Rocket will automatically remove us from
        //  its Signal. No further event removal or maintenance required.
        rocket.dispose();
    }

    public function enginesFiredHandler():void
    {
        trace( "engines were fired" );
    }
}

これをはるかに超えて、パラメーターの受け渡しやあらゆる種類の興味深いことを行うことができます。彼のブログをチェックすることをお勧めします。

http://flashblog.robertpenner.com

AS3 シグナルの使用を開始する方法に関するチュートリアルは次のとおりです。

http://www.youtube.com/watch?v=wB_sWJ5EgXI

于 2013-02-14T23:14:07.867 に答える
0

FlashPlayer 11 では、すべての子を削除DisplayObjectContainerする機能をサポートしています。removeChildrenしたがって、whileループを次のように置き換えることができますcontainer.removeChildren()

すべての eventListeners を削除することに関しては、このための組み込みメソッドはありません。ただし、特定のオブジェクトに追加されたすべてのリスナーを追跡する何かを自分で記述して、コレクションをループすることでそれらをすべて削除できるようにすることもできます。

于 2013-02-14T18:18:05.990 に答える