添加到Array后,自定义AS3类为null

时间:2009-05-16 14:44:05

标签: flash actionscript-3 null object-reference

我是一名C#开发人员,正在尝试学习一些AS3,所以这将是一个非常新手的问题。

我对范围和GC感到困惑,因为我有一个自定义的MovieClip扩展类(Slide),我在循环中创建实例并将push()创建到Array中,但之后这些项为null我将它们从集合中拉出来。

var ldr:URLLoader = new URLLoader();
ldr.load(new URLRequest("presentation.xml"));
ldr.addEventListener(
    Event.COMPLETE,
     function(e:Event):void {
         config = new XML(e.target.data);
         for (var i:Number = 0; i < config.slides.slide.length(); i++)
         {
             var node = config.slides.slide[i];
             var slide:Slide = new Slide();                      
             slides.push(slide);

             addChild(slide); // Works fine
         }
     }
);

slides.forEach(function(e:*, index:int, array:Array):void
    {
        addChild(e); // Causes "Parameter child must be non-null" exception
    }
);

我希望以后能够引用幻灯片,以便根据需要切换它们 - 如何保留对新对象的引用?

更新:看来这有两个问题。 forEach调用是在调用URLLoader的complete事件之前进行的,而且forEach似乎没有按预期工作。这是最终的工作代码:

var ldr:URLLoader = new URLLoader();
ldr.load(new URLRequest("presentation.xml"));
ldr.addEventListener(
    Event.COMPLETE,
    function(e:Event):void {
        config = new XML(e.target.data);
        for (var i:Number = 0; i < config.slides.slide.length(); i++)
        {
            var node = config.slides.slide[i];
            var slide:Slide = new Slide();                      
            slides.push(slide);
        }
        for each (var sl in slides)
        {
            addChild(sl);
        }
    }
);

2 个答案:

答案 0 :(得分:3)

您的slides.forEach调用正在触发事件之前执行,因此slides数组没有值。

答案 1 :(得分:1)

试试这个。让我们看看它是否跟踪你的幻灯片。

var ldr:URLLoader = new URLLoader();
ldr.addEventListener(Event.COMPLETE, processXML);
ldr.load(new URLRequest("presentation.xml"));

function processXML(e:Event):void {
    config = new XML(e.target.data);
    var slide:Slide;
    for (var i:Number = 0; i < config.slides.slide.length(); i++)
    {
        var node = config.slides.slide[i];
        slide = new Slide();                                          
        slides.push(slide);

        addChild(slide); // Works fine
    }

    for each(var slide:Slide in slides){
        trace(slide);
    }
 }

我在这里编码,所以我不能向你保证它会工作。此外,我没有剩下的代码,所以你必须自己测试。