通过迭代变量动态访问AS3实例

时间:2013-10-21 10:36:24

标签: actionscript-3 flash loops instance

我希望能够通过循环包含描述路径的字符串的数组来动态访问舞台上的实例。

private var clockKeeper:Array = new Array("LB.anim.clock.lbclock");

trace(stage.LB.anim.clock.lbclock.text);
for (var key in clockKeeper) {
    trace(stage[clockKeeper[key]].text);
}

当我使用第一个trace语句手动访问它时,它可以工作。 当我动态地执行它时,似乎Flash试图找到名为“LB.anim.clock.lbclock”的对象而不是LB.anim ....

如何更改此行为并使其有效?

1 个答案:

答案 0 :(得分:1)

您应该尝试拆分“路径”,该路径应包含本地可用的名称,并按顺序寻址每个对象。 “本地可用名称”表示应该有stage.LB,该对象应具有属性anim等等。

function getObjectByPath(theRoot:DisplayObjectContainer,
    thePath:String,separator:String='.'):DisplayObject 
{
    var current:DisplayObjectContainer=theRoot;
    var splitPath:Array=thePath.split(separator);
    while (splitPath.length>0) {
        var named:DisplayObject = current.getChildByName(splitPath[0]);
        var addressed:DisplayObject=current[splitPath[0]];
        // either named or addressed should resolve! Otherwise panic
        if (!addressed) addressed=named; else named=addressed;
        if (!named) return null; // not found at some position
        splitPath.shift();
        if (splitPath.length==0) return named; // found, and last
        current=named as DisplayObjectContainer;
        if (!current) return null; // not a container in the middle of the list
    }
    // should never reach here, but if anything, just let em
    return current;
}

这提供了两种通过名称或属性名解析路径的方法,并且属性名称优先。然后,您应该将结果类型化为正确的类型。

是的,请按以下方式调用:

trace((getObjectByPath(stage,clockKeeper[key]) as TextField).text);