0

Main(ドキュメント クラス)、Container、Area コントロールの 3 つのクラスがあります。

メインクラスのコード

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


        }

}

Container クラスのコード

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

ステージを保存するために静的変数が必要なのはなぜですか? すでにすべての DisplayObject に格納されており、stageプロパティからアクセスできます。

とにかく、問題は AreaControl オブジェクトを表示リストに追加しないことです。そのため、ステージプロパティは常に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 に答える