为什么以下示例中的阶段不可用?

时间:2013-11-23 08:32:28

标签: actionscript-3 stage

我正在使用Flash Professional IDE。引用下面的类,如果我将FLA的class属性设置为testingsub1(忽略Main),则代码可以正常工作。但是,如果我将类设置为Main,则代码将在stage.addChild(container);测试时死于“TypeError:错误#1009:无法访问空对象引用的属性或方法。”。

这违背了我的理解,即舞台是全局的,并且始终可以直接添加显示对象。任何见解和解决方案?

package {
    //import com.idtlw.iso.utils.Const;
    import flash.display.*;

    public class testingsub1 extends testing {

        public function testingsub1() {
            trace("initializing testing sub 1");
            var container:Sprite=new Sprite();

            var test1:Sprite=new Sprite();

            container.addChild(test1);
        }
    }
}

package {
    import flash.display.*;

    public class testing extends Sprite {

        public function testing() {
            trace("initializing testing");
            var container:Sprite=new Sprite();

            var test1:testreg1=new testreg1();

            container.addChild(test1);

            stage.addChild(container);
        }
    }
}

package 
{

        import flash.display.*;

        public class Main extends Sprite
        {
                public function Main ()
                {
                        var test1:Sprite=new Sprite();
                        stage.addChild(test1);

                        var tester:testingsub1=new testingsub1();
                }
        }
}

2 个答案:

答案 0 :(得分:0)

如果你住在FlashDevelop教程中,你会发现一系列棘手的代码:

if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE,init);

这意味着即使是Main类也不总是可以使用stage。添加此行,创建function init(e:Event=null):void放置任何需要访问舞台的代码,然后进行设置。

关于你的标题问题 - 没有类在构造函数中有stage可用设计,即使在设计时将一个对象放置到舞台并且它有一个自定义构造函数,你也无法获得对舞台内的有效引用那个构造函数。 stage属性仅在将对象添加到已填充对象的显示列表或暂存后才填充。

答案 1 :(得分:0)

正如他在评论中已经提到的原型一样,Stage只是DisplayObjects的一个便利属性,只有当该对象在显示列表中时才可访问。

在您的测试类中,您正在访问它的舞台对象。在将其添加到显示列表之前,它始终为null。在构造函数完成之后才会添加它,因此就是NRE。正确的处理方法是在你的ctor中注册一个事件监听器来监听ADDED_TO_STAGE,然后添加容器。

但我认为你想要的方法并不是一个好主意。 DO通常应该是自包含的,而不是直接通过舞台访问显示列表。将容器添加到测试类(或者只是将类用作容器)更好的做法,让主要将该类添加到显示列表中。