【问题标题】:Why is stage not available in the following example?为什么在以下示例中没有 stage 可用?
【发布时间】:2013-11-23 08:32:27
【问题描述】:

我正在使用 Flash Professional IDE。参考下面的类,如果我将 FLA 的类属性设置为 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();
                }
        }
}

【问题讨论】:

  • stage 不可全局访问。 DisplayObject 的stage 属性为空,除非它附加到舞台的显示列表层次结构中。
  • 我认为——除了主显示对象——没有任何东西需要直接访问stage。我们谈论的是可以嵌套在许多可能情况下的组件;一个组件不能直接向舞台添加另一个组件。

标签: actionscript-3 stage


【解决方案1】:

如果您仔细阅读 FlashDevelop 教程,您会发现一行代码很棘手:

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

这意味着即使是 Main 类也不总是可以使用该阶段。添加这一行,创建一个 function init(e:Event=null):void 将需要访问阶段的任何代码放在那里,然后你就设置好了。

关于您的标题问题 - 没有任何类在设计时在构造函数中提供 stage,即使在设计时将对象放置到阶段并且它具有自定义构造函数,您也无法在该构造函数中获得对阶段的有效引用. stage 属性仅在对象添加到已填充对象的显示列表或舞台后才会填充。

【讨论】:

  • 在这种情况下,我认为 init() 应该包含匹配的 if (e!null) removeEventListener(Event.ADDED_TO_STAGE,init);
  • 是的,FD 的教程在任何情况下都说删除事件监听器,因为如果没有匹配的监听器,调用removeEventListener() 不会做坏事。
【解决方案2】:

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

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

但是,我认为您的意图方法不是一个好主意。 DO 通常应该是自包含的,而不是直接通过舞台访问显示列表。将容器添加到您的测试类中(或仅使用该类作为容器)并让您的主在适当的情况下将该类添加到显示列表中是更好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多