这是显示对象步行者的文档类。测试课程时,请务必将关闭严格模式(howto here)。还把一些东西放在舞台上。当严格模式关闭时,对象walker工作得很好。但是,我想让它在严格模式下工作。我试过更改有问题的部分和addig(dispObj作为DisplayObject),没有运气。
package {
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
public class DisplayWalker extends MovieClip {
public function DisplayWalker() {
showChildren(stage, 0);
}
private function padIndent(indents:int):String {
var indent:String = "";
for (var i:uint = 0; i < indents; i++) {
indent += " ";
}
return indent;
}
private function showChildren(dispObj:DisplayObject, indentLevel:Number):void {
for (var i:uint = 0; i < dispObj.numChildren; i++) {
var obj:DisplayObject = dispObj.getChildAt(i);
if (obj is DisplayObjectContainer) {
trace(padIndent(indentLevel), obj, obj.name);
showChildren(obj, indentLevel + 1);
} else {
trace(padIndent(indentLevel), obj);
}
}
}
}
}
答案 0 :(得分:4)
您的类将在严格模式下生成编译时错误,因为您正在尝试访问numChildren和getChildAt方法,这些方法在DisplayObject类上不可用,但首先访问其中一个子类DisplayObjectContainer。
它在非严格模式下工作的原因是,在运行时,您实际上是在传递DisplayObjectContainer(Stage,Sprite等)的子类。
只需将DisplayObject替换为DisplayObjectContainer作为showChildren方法中dispObj的类型。 DisplayObjects不能有子项,并且始终是显示对象树中的叶子,这是showChildren方法必须考虑的内容。
答案 1 :(得分:1)
Stiggler在正确的轨道上,但是没有看到你已经检查过DisplayObjectContainers。
您只需稍微修改一下代码即可。我没有测试代码,但无论如何你应该能够弄明白;)
private function showChildren(dispObj:DisplayObject, indentLevel:Number):void
{
var dOC:DisplayObjectContainer = dispObj as DisplayObjectContainer;
if(dOC == null)
{
trace(padIndent(indentLevel),obj);
}
else
{
trace(padIndent(indentLevel), obj, obj.name);
var obj:DisplayObject = null;
for (var i:uint = 0; i < dispObj.numChildren; i++)
{
obj = dOC.getChildAt(i);
showChildren(obj, indentLevel + 1);
}
}
}