我是一名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);
}
}
);
答案 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);
}
}
我在这里编码,所以我不能向你保证它会工作。此外,我没有剩下的代码,所以你必须自己测试。