【问题标题】:ActionScript 3.0 classes: not able to with access stageActionScript 3.0 类:无法访问阶段
【发布时间】:2013-09-20 07:40:38
【问题描述】:

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

}
}

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

【问题讨论】:

    标签: actionscript-3 class inheritance singleton stage


    【解决方案1】:

    为什么需要一个静态变量来存储舞台?它已经存储在所有 DisplayObjects 中,并且可以通过 stage 属性访问。

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

    这里的良好做法是仅在 Event.ADDED_TO_STAGE 触发后访问您的舞台。就像在您的 Main 课程中一样。

    我建议您查看您的应用架构,因为它很少需要在任何地方存储指向舞台的全局链接,但如果您真的需要它 - 您可以在 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

    访问您的舞台

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

    【讨论】:

    • 嘿,感谢您的回答,但我无法将阶段分配给区域控制作为“区域控制 = 阶段”。我得到的错误是“错误 #1074:非法写入全局只读属性 AreaControl。”还有其他方法吗?还要看Container类中的函数 override public function get stage() : Stage { trace("$$");返回区域控制.stage; }
    • 您没有更改 AreaControl 类中的任何代码,您的阶段变量只有 getter,因此它认为它是只读的。创建一个 setter 方法或只是用我的替换您的 AreacControl 类内容(那里是一个完整的类,是的,它就是那么小)。正如我所说 - 你不再需要任何 get stage() 函数 - 链接是 AreaControl.stage
    • 区域控制类也有更多的代码。我还需要从 Container 类中获得舞台。帮助我。
    • pastie.org/8341314 你应该在你的容器中创建 Event.ADDED_TO_STAGE 监听器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多