0

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

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....

我怎样才能改变这种行为并让它发挥作用?

4

1 回答 1

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

于 2013-10-21T12:32:46.117 回答