سؤال

أنا مطور C# وأحاول تعلم بعض مبادئ AS3، لذلك سيكون هذا سؤالًا مبتدئًا جدًا.

أشعر بالارتباك فيما يتعلق بالنطاق و GC، حيث أن لدي فئة مخصصة لتوسيع MovieClip (Slide) والتي أقوم بإنشاء مثيلات لها داخل حلقة ودفع () إلى صفيف، ولكن بعد ذلك تصبح العناصر فارغة عندما أقوم بسحبها خارج المجموعة.

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);
        }
    }
);
هل كانت مفيدة؟

المحلول

جرب هذا.دعونا نرى ما إذا كان يتتبع الشرائح الخاصة بك.

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

أقوم بترميزه هنا لذا لا أستطيع أن أؤكد لك أنه سيعمل.كما أنني لا أملك بقية الكود، لذا سيتعين عليك اختباره بنفسك.

نصائح أخرى

يتم تنفيذ استدعاء Slides.forEach قبل إطلاق الحدث، وبالتالي لا تحتوي مصفوفة الشرائح على أي قيم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top