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



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

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);
}

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

如何更改此行为并使其正常工作?

您应该尝试拆分"路径",然后该路径应由本地可用名称组成,并按顺序对每个对象进行寻址。"本地可用名称"意味着应该有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);

最新更新