错误#2007:参数child必须为非null。在for循环中添加Child时

时间:2014-04-24 12:14:44

标签: actionscript-3 flash actionscript

我有这个错误,不知道为什么会出现这种错误,我相信它的范围有问题。因为我已经添加了Child。我甚至无法删除Child,在循环中添加了子项,我不确定如何操作从外部添加到循环内的子项(在循环结束后)。

我正在尝试将循环内的子项添加到视口中,但我正在使用removeChild演示问题以减少复杂性。因为我试图找出为什么它给我这个错误的原因,并试图了解我应该做什么。

谢谢你的时间!

for (var j:int = 5; j < somedata.length; j++) 
                {
                    if(somedata[j]){
                    var myLoader:Loader = new Loader();
                    var image:Bitmap;
                    var url:URLRequest = new URLRequest("http://www.rentaid.info/rent/"+somedata[j]);
                    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
                    myLoader.load(url);




                    function onImageLoaded(e:Event):void {
                    image = new Bitmap(e.target.content.bitmapData);

                    var mw:Number = bf.width*2;
                    var mh:Number = bf.height*1.2;   
                        image.y = bf4.y+25;
          /* if you set width and height image same with the stage use this */
                    image.width = mw;
                    image.height = mh;
                    var _contentHolder: Sprite;
                    addChild(_contentHolder);
                    _contentHolder.addChild(image);
                    }
            }

                    removeChild(_contentHolder);
            }

编辑:

function LoadImages() : void {
    for (var j:int = 5; j < somedata.length; j++)  {
        var image:Bitmap;
        myLoader = new Loader;
        var urlRequest : URLRequest = new URLRequestfor ("http://www.rentaid.info/rent/"+somedata[j]) 
        myLoader.load(urlRequest);
        myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadComplete);
    }

}

function LoadComplete(event : Event) {

            _contentHolder.addChild(image);
}

或类似的东西?

var loadedArray:Array = new Array();
            var counter:int=0;

            function loadImage():void{

             var loader:Loader = new Loader();
                var image:Bitmap;
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,  onImageLoaded);
                loader.load(new URLRequest("http://www.rentaid.info/rent/"+somedata[counter]));






                function onImageLoaded(e:Event):void {
                image = new Bitmap(e.target.content.bitmapData);



                 loadedArray.push(e.target.content);

   if(counter == somedata.length-1){    

       for(var i:uint = 5; i < somedata.length; i++){
           image[i].x = 0 + i * 100;

           addChild(_contentHolder);
            _contentHolder.addChild(image[i]);
                currentY += _contentHolder.height + 10;
       }    
   }

   else{
       counter++;
       loadImage();

1 个答案:

答案 0 :(得分:0)

您没有定义_contentHolder。目前,您还没有addChild(_contentHolder)。这就是removeChild行抛出错误的原因 此外,您不需要addChild(image),然后将图像添加为_contentHolder的子项。其中一个会做。事实上,DisplayObject只能位于显示器树的一个位置。如果您想将图像作为_contentHolder的子图像,则只需要_contentHolder.addChild(图像)。

如果您希望将所有图像实例添加到SAME _contentHolder中,最好在for循环中声明并实例化_contentHolder OUTSIDE;然后,每个foor循环迭代将您的图像添加到同一个Sprite对象。当您删除_contentHolder时,子图像也将消失(尽管它们仍然是_contentHolder的子项)。

理想情况下,您不应该像在for循环中那样异步操作多个Loader。而不是使用for循环,创建一个变量来跟踪您最多的索引值,并在每个图像加载时,递增该值并使用它来检查是否所有图像都已加载。如果没有,请加载下一个。这将要求代码的Loader部分位于其自己的函数中,如果需要加载另一个图像,则该函数最初从onImageLoaded调用AND。

同样,跟踪哪个索引的变量最初需要设置,并在每个图像加载时递增。

回复您编辑过的问题:

加载当前图像后,您的第一个新代码示例不会尝试加载NEXT图像。另外,作为提示:函数名称通常不以大写字母开头;这可以防止与类定义混淆 此外,您的第一个新代码示例并未调用“LoadImages&#39;函数初始加载第一个图像。

你的第二个例子看起来应该对我有用。你真的试过这个版本吗?

我唯一建议的是使用其他变量定义您的Loader并删除&#39;已加载的&#39;中的Event.COMPLETE侦听器。功能。添加事件侦听器时,您还可以添加:

loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); 

监听器并跟踪每个图像的进度。

我还建议在整个代码中添加跟踪语句,以查看它被卡住的位置。