2010-03-10 32 views
0

我有一個Canvas,裏面有很多組件,而且裏面有很多組件。如何以遞歸方式訪問兒童的孩子?

getChildren()僅返回頂級子級。檢索所有孩子(孩子的孩子的孩子等等)的最佳方法是什麼?

好吧,我不知道如何通過迭代孩子來做到這一點,但代碼非常混亂。我寧願使用一個很好的遞歸函數。有沒有人寫過這個?還是有一個Util類來做到這一點?

回答

3
private function recuse(display : DisplayObjectContainer) : void { 
    if(display) { 
    for (var i : int = 0;i < _display.numChildren;i++) { 
     var child : DisplayObject = display.getChildAt(i); 
     trace(child.name); 
     if(child is DisplayObjectContainer) { 
      recuse(DisplayObjectContainer(child)); 
     } 
    } 
} 

}

+0

這幾乎是同樣的解決方案不是嗎? – 2010-03-10 12:50:04

+0

這工作順利,謝謝!更正:_display應顯示 – Yeti 2010-03-10 12:53:47

+0

theo:是的,它看起來很相似,當我貼我的時候我沒有看到你的解決方案。所以我得到支票似乎有點不公平 – maxmc 2010-03-10 19:06:40

3

嘗試一些可能(注意,您可以遞歸返回列表,如果你要收集所有引用到頂級迭代)

function inspect(object:DisplayObject):void 
{ 
    if(object is DisplayObjectContainer) 
    { 
     var casted:DisplayObjectContainer = object as DisplayObjectContainer 

     trace("DisplayObjectContainer ", casted.name) 

     for(var depth:int = 0; depth < casted.numChildren;depth++) 
     { 
      inspect(casted.getChildAt(depth)) 
     } 

    }else{ 

     trace("DisplayObject", object.name); 
    } 
} 


inspect(this) 
1
function theCallbackFunction(obj:DisplayObject):void 
{ 
    trace(obj.name); 
} 

//Visit the children first. 
//Deep most objects will be visited first and so on. 
//stage is visited at the end. 
//Uses recursion 
function depthFirst(obj:DisplayObject, func:Function):void 
{ 
    if(!(obj instanceof DisplayObjectContainer)) 
    { 
    func(obj); 
    return; 
    } 
    var p:DisplayObjectContainer = DisplayObjectContainer(obj); 
    var len:Number = p.numChildren; 
    for(var i:Number = 0; i < len; i++) 
    { 
    var child:DisplayObject = p.getChildAt(i); 
    depthFirst(child, func); 
    } 
    func(obj); 
} 

//Visit the siblings first. 
//stage is visited first, then its children, then the grand children and so on 
//No recursion. 
function breadthFirst(obj:DisplayObject, func:Function):void 
{ 
    var q:Array = []; 
    q.push(obj); 
    var p:DisplayObjectContainer; 
    var i:Number, len:Number; 
    while(q.length != 0) 
    {  
    var child:DisplayObject = queue.shift(); 
    func(child); 
    if(!(child instanceof DisplayObjectContainer)) 
     continue;   
    p = DisplayObjectContainer(child); 
    len = p.numChildren; 
    for(i = 0; i < len; i++) 
     q.push(p.getChildAt(i)); 
    }  
} 

depthFirst(this.stage, theCallbackFunction); 
breadthFirst(this.stage, theCallbackFunction);