После добавления в массив пользовательский класс AS3 становится пустым - PullRequest
1 голос
/ 16 мая 2009

Я разработчик C #, который пытается изучить AS3, так что это будет довольно новый вопрос.

Я запутался в отношении объема и GC, так как у меня есть собственный класс, расширяющий MovieClip (Slide), в котором я создаю экземпляры внутри цикла и push () в массив, но после этого элементы становятся пустыми Я вытащил их из коллекции.

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, а также 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 ]

3 голосов
/ 16 мая 2009

Ваш вызов slides.forEach выполняется до запуска события, поэтому массив слайдов не имеет значений.

1 голос
/ 16 мая 2009

Попробуй это. Посмотрим, отследит ли он ваши слайды.

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

Я здесь кодирую, поэтому не могу вас заверить, что это сработает. Кроме того, у меня нет остальной части кода, поэтому вам придется проверить его самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...