0

我有三个类 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;
      }

}
}

我无法从这些课程中进入舞台,有人可以帮助我吗?

4

1 回答 1

0

为什么需要一个静态变量来存储舞台?它已经存储在所有 DisplayObjects 中,并且可以通过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访问您的舞台

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

于 2013-09-20T09:06:46.763 回答