【问题标题】:AS#3 Array is not clearing its contentsAS#3 数组未清除其内容
【发布时间】:2013-03-17 13:03:09
【问题描述】:

首先我会简单解释一下:

我有 2 个数组,第一个 Array:holder,第二个 Array:Clips。 第一个数组是作为网格模式的动态空框,通过循环将每个项目推入数组并添加到舞台//仅针对位置 x,y

第二个数组:Clips 是动态加载的 SWF 电影,共 10 个 这些加载的 SWF 剪辑被“addChild”到 Holder Array 中,因此这些剪辑将在网格模式中同时被推入到 Clips 数组中,以供参考示例

     Clips[1].x = 50 ; // this works fine 

所以我知道我的剪辑在那里,正确引用。但是 icant 似乎做的是从 array:Clips 中删除所有内容

      var len:int = Clips.length;
      for( var i:int = 0; i < len; i++ ) {
      this.removeChild( Clips[i] ) ;        
      }

我也尝试过拼接,结果相同,只是要么抛出错误,要么什么都不做,无论哪种方式,我的项目都没有删除/删除。

解释我在一个数组中加载 15 个项目的简单方法,每次按下按钮时我都想清除该数组并重新填充另外 15 个项目,这永远每 10 秒发生一次。..

我可以重新填充没问题,它会继续在旧内容上加载更多内容,但我希望清除旧内容

【问题讨论】:

    标签: actionscript-3 flash actionscript flash-cs5


    【解决方案1】:

    试试这个。如果它有效,则意味着您正在尝试将孩子从错误的父母那里移除。在这种情况下,您应该收到运行时错误。如果以下代码不会导致错误但屏幕上仍有内容,那么您的代码在某处复制了内容。如果执行加载的代码被调用两次,就会发生这种情况。

          var len:int = Clips.length;
          for( var i:int = 0; i < len; i++ ) {
          Clips[i].parent.removeChild(Clips[i]);        
          }
    

    【讨论】:

    • 我以为我可能已经复制了两次,但是当我跟踪数组时,它只显示 8 个对象和 1 个符号
    • 上面的代码会发生什么?如果加载代码被调用两次,那么您的数组将显示 8 个对象,因为它会覆盖旧数组。那么问题是旧的数组内容没有被垃圾收集,因为它仍然有一个引用(因为 swfs 被添加到阶段)。尝试将跟踪语句放在执行加载的代码块中。
    • 什么是 SLOTS 数组?您需要从中删除。
    • if(Clips[i] != null && Clips[i].parent != null){ Clips[i].parent.removeChild(Clips[i]); } 检查父母是问题所在,由于我的动画原因,他们似乎分散在不同的父母中扔掉了我的项目
    • @parele 虽然这确实解决了问题,但我选择不建议它,因为它解决了症状而不是原因。这可能会导致以后出现更多问题。您应该尝试追踪为什么有空值被推入您的数组。
    【解决方案2】:

    为了防止错误,修改你的条件:

    if(this.contains(Clips[i]){
        this.removeChild(Clips[i]);
    }
    

    如果仍然无法正常工作,您可能是从错误的剪辑中删除,即不是“这个” - 试试这个:

    if(Clips[i] != null && Clips[i].parent != null){
            Clips[i].parent.removeChild(Clips[i]);
        }
    

    (添加了Clips[i] != null 部分条件以检查以下 cmets 中出现的错误)

    这会检查剪辑是否指定了父级(如果有,则它在另一个剪辑中)并专门从该剪辑中删除它,而不仅仅是“this”。

    ..我还建议使用 Vector,而不是 Array - 您可以将任何类型的值放入数组中,因此如果您将非 DisplayObject 放入其中,您将在尝试时收到错误消息从舞台上删除 if:

    var clips:Vector.<DisplayObject> = new Vector.<DisplayObject>();
    

    而不是:

    var clips:Array = [];
    

    除了上面庞大的声明之外,这个函数在大多数方面与数组完全一样(推送、拼接、使用方括号表示法的引用元素,例如clips[0] 等),但只会让你放置某些类型的对象/variable 在其中 - 在本例中为 DisplayObject。如果你试图在里面放一个'int',它不会让你 - 它也运行得更快!它们在任何情况下都值得使用,但在这里它们可能会有所帮助,以防万一你在没有意识到的情况下将其他东西放入该数组中(我已经做过很多次了)。

    希望这会有所帮助!

    【讨论】:

    • 我通常不使用大写字母,仅用于示例。我会尝试你的方法并回复你,谢谢
    • 啊,好吧,让我知道你是怎么做的。我已经稍微修改了最后一个建议,因为它不需要条件的第一部分,希望您及时注意到(如果您不这样做,请快速更改!)
    • 你在正确的页面上这是我的错误,无论我如何处理这个“参数子必须是非空的。”,或者不能是父母的孩子..我明白他们的意思,我假设那里存储在其他地方
    • 好的,在调用 removeChild 之前将 trace('clip is: ' + Clips[i]) 放入,让我知道它在损坏的那个上输出什么。如果您查找,我已经修改了条件以考虑空值(但这不是解决它们的原因!)
    • 这工作两次然后抛出错误:无法访问空对象引用的属性或方法。 1++ 认为我必须重新考虑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2020-01-10
    • 2012-09-15
    相关资源
    最近更新 更多