2013-02-14 39 views
0

所以,看到一隻簡單的方法來從容器中刪除所有孩子的這樣有沒有方法可以更輕鬆地移除偵聽器?

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

有沒有辦法在複數刪除stage.eventListener(如果不使用的話IM知道對不對),類似的階段。事件監聽器?類似的東西?

謝謝!

+0

可能重複[?閃光AS3的EventDispatcher - 讓註冊聽衆的名單中的任何方式( http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting-a-list-of-registered-listeners) – poke 2013-02-14 18:22:13

+0

另外:http:// stackoverflow。com/questions/1452746/how-to-remove-all-event-listeners-from-a-display-object – poke 2013-02-14 18:22:59

+0

對不起:(對這個很倉促,並沒有檢查:( – 2013-02-14 18:47:14

回答

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屬性添加到正在保存的對象中,並檢查該屬性,但我從來沒有將該屬性設置爲默認值,因此我沒有將其包含在我的代碼中

+0

另外,我只是把它添加到我的自定義的Sprite基類爲我寫的輕量級框架,它工作得很好。 – 2013-02-14 18:29:59

0

在FlashPlayer 11中,DisplayObjectContainer支持刪除所有子項的removeChildren函數。所以你可以用container.removeChildren()

替換你的while循環至於刪除所有的eventListeners,這裏沒有內置的方法。但是,您可以自己編寫一些內容,以跟蹤添加到特定對象的所有偵聽器,並允許您通過循環收集來移除所有偵聽器。

0

不幸的是,簡短的答案是,這是不可能的。默認情況下,事件調度員不公開地跟蹤哪些偵聽器已註冊。所以你不能遍歷一些列表,只是將它們全部刪除。你將不得不記住你自己添加的聽衆。

0

有一個非常簡單的解決方案,Robert Penner的現象信號庫。這裏有一個例子:

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

相關問題