在完成补间后,AS3 / CS4删除了TextField再次出现

时间:2009-09-04 09:13:02

标签: actionscript-3 flash-cs4

我通过Loader()类加载一个swf。当加载swf时,我遍历root的所有子节点并使用removeChild()删除任何TextField。这最初起作用 - 删除了TextField。但作为加载的swf完成和循环中的补间,删除的TextField以某种方式重新出现。 TextField是动态文本。如果我删除一些StaticText,这将被删除。这是怎么回事?

loopChildren(root);
function loopChildren(dispObj:*):void {
    for (var i:int = 0; i< dispObj.numChildren; i++) {
        var obj:DisplayObject = dispObj.getChildAt(i);
        if (obj is DisplayObjectContainer) {
            loopChildren(obj);
        }
        else {
            if (obj is TextField) {
                obj.parent.removeChild(obj);
                i--;
            }
        }
    } 
}

如果我用一个定时器(5秒intervall)和trace(obj.name)为所有孩子调用loopChildren,我注意到obj.name改变了。 TextField称为instance11,instance32,instance54等。似乎创建并连续添加了一个新实例?

编辑: 如果我将代码直接传输到swf并在不使用包装器的情况下运行它,它会按预期工作。我必须错过通过另一部电影加载时发生的事情吗?

EDIT2: 我应该说我想要删除的TextField是在与补间相同的时间线上的一个单独的层中。如果我将补间放在自己的时间轴中,它似乎按预期工作。但是动态文本和补间不能一起生活吗?

2 个答案:

答案 0 :(得分:2)

听起来你的文本字段是在舞台上定义的(即在FLA中,不是由脚本实例化的),并且它所在的图层可能有一个在补间中的某个点播放的关键帧。

如果这是正确的,那么您遇到的是关于时间轴和脚本环境的竞争性质的Flash相当低级别的限制。当您通过补间播放时,每个时间轴关键帧都会为Flash编写一些信息,说明此时舞台上应该有哪些对象,以及它们应该在哪里等等。

但是,当您也开始使用脚本引用这些相同的对象时,通常Flash必须猜测您是希望脚本还是时间轴中的信息优先。在这种情况下,可能发生的事情是,在您使用脚本删除文本字段后,您的补间播放的帧之一引用相同的字段,并且Flash不知道删除是否应该是永久性的,或者是否要兑换关键帧并重新创建字段。

因此,对你的问题的简短回答(太迟了!),一般来说你应该尝试使用时间轴补间或脚本处理你的舞台元素,但不能同时处理两者。这就是编辑#2中的解决方案有效的原因;因为通过将补间移动到自己的时间轴上(我猜)你不再使用编码有关文本字段信息的关键帧。另一种解决方案可能是通过时间线删除有问题的文本字段(通过播放到该文本字段不再存在的关键帧)。或者,当然你也可以通过脚本控制你的文本域,创建它并销毁它,所以它永远不会成为时间轴的一部分。

答案 1 :(得分:0)

为什么不将文本字段设置为空?

loopChildren(root);

function loopChildren(dispObj:DisplayObjectContainer):void 
{
    for each(var i:int = 0; i < dispObj.numChildren; i++) 
    {
        var obj:DisplayObject = dispObj.getChildAt(i);
        if (obj is DisplayObjectContainer) 
        {
            loopChildren(obj);
        }
        else if (obj is TextField) 
        {
            TextField(obj).text = "";
        }
    } 
}
相关问题