ActionScript 3.0类:无法访问阶段

时间:2013-09-20 07:40:38

标签: actionscript-3 class inheritance singleton stage

我有三个类Main(文档类),Container和Area控件。

主类代码

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import com.andreanaya.areacontrol.Container;
 public class Main extends Container 
    {
        private var _build : Build;

        public function Main():void 
        {
            super();
            if (stage) stageHandler();
            else addEventListener(Event.ADDED_TO_STAGE, stageHandler);
        }

        private function stageHandler(e:Event = null):void 
        {
            trace("entry point");
            removeEventListener(Event.ADDED_TO_STAGE, stageHandler);
            // entry point


        }

}

容器类代码

package com.andreanaya.areacontrol
{
   import flash.display.Sprite;
   import flash.display.Stage;
   import flash.display.DisplayObject;
   import flash.system.ApplicationDomain;


   public class Container extends Sprite
   {

      public function Container() {

         super();
         }
override public function get stage() : Stage {
         trace("$$");
         return AreaControl.stage;
      }
}
}

区域控制类代码

package com.andreanaya.areacontrol
{
   import flash.display.Sprite;
   import flash.display.Stage;


   public class AreaControl extends Sprite
   {

      public function AreaControl() {
         super();

         if(_instance)
         {

            throw new Error("AreaControl is already instantiated.");
         }
         else
         {

            _instance = this;
            _stage = stage;
            return;
         }
      }

      private static var _instance:AreaControl;

      private static var _stage:Stage;

       static function get stage() : Stage {

         return _stage;
      }

}
}

我无法从这些课程中访问舞台,任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

为什么需要一个静态变量来存储阶段?它已存储在所有DisplayObject中,并且可由 stage 属性访问。

无论如何,您的问题是您没有将AreaControl对象添加到显示列表中,因此它的 stage 属性将始终为 null

只有在Event.ADDED_TO_STAGE被触发后,这里的良好做法才会访问您的舞台。就像你的主课一样。

我建议您查看您的应用程序架构,因为很少需要在任何地方存储到舞台的全局链接,但如果您确实需要它 - 您可以在 stageHandler中的Main类中分配它。并且您不需要 AreaControl 的实例来分配阶段链接。你可以这样做:

package com.andreanaya.areacontrol {
    import flash.display.Sprite;
    import flash.display.Stage;


    public class AreaControl { //You don't even need to extend it from Sprite

        public static var stage: Stage;

    }
}

.......

    private function stageHandler(e:Event = null):void 
    {
        trace("entry point");
        removeEventListener(Event.ADDED_TO_STAGE, stageHandler);
        // entry point
        // It's not an accident it is called "entry point", you should
        // add your code AFTER this line if you don't want any *stage* issues
        AreaControl = stage; //It's never null here;
    }

启动 stageHandler 功能后,您可以使用 AreaControl.stage

访问您的舞台

有很多方法可以处理静态变量和单例,请考虑阅读更多相关内容。我向你展示的方式远非最佳