1

他のクラスでアクセスできるように、ステージ用のシングルトン クラスを作成したプログラムがあります。

テキストを含む他のシンボルがいくつかあるため、コードでテキストを変更する必要があります。

私の問題は、Classic Text の代わりに TLF テキストを使用するたびに、シングルトン ステージ クラスを参照するすべてのクラスが "TypeError: Error #1009: Cannot access a property or method of a null object reference."

TLFテキストで正常に動作する以前のプログラムがありますが、ステージにシングルトンクラスを使用したのはこれが初めてなので、何らかの形でそれが含まれていると思います。

関連する問題 (公開設定など) について見た他の投稿でいくつかの解決策を試しましたが、これまでのところ何も機能していません。

以下は、最初のエラーが発生する場所です。

// Constructor
    public function Zoom(object:MovieClip) {
        // Set the stage
        stage = StageManager.instance.stage;

        // Set the zoom object
        zoomObject = object;            

        // Add event listener for the mouse wheel
        stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseZoom); // ERROR OCCURS HERE

        if (Controls.instance.controls.zoomInBtn && Controls.instance.controls.zoomOutBtn) {
            Controls.instance.controls.zoomInBtn.addEventListener(MouseEvent.CLICK, zoomIn);
            Controls.instance.controls.zoomOutBtn.addEventListener(MouseEvent.CLICK, zoomOut);
        }
    }

シングルトンクラスは次のとおりです。

package {
import flash.display.Stage;

// Singleton class so any other classes can access the stage.
public class StageManager {

    // Publicly accessible singleton instance
    public static var instance:StageManager = new StageManager();

    private var m_stage:Stage;

    // Getters and Setters
    public function set stage(stg:Stage):void {
        m_stage = stg;
    }

    public function get stage():Stage {
        return m_stage;
    }
}
}
4

2 に答える 2

0

まず、独自のクラスのプロパティ/メソッド名に API メソッド/プロパティ名を使用するのは正しくありません。それは混乱を招きます。

次に、null エラーがスローされた場合、プロパティにアクセスしようとしているオブジェクト (ステージ) は null です。多くの理由が考えられます。たとえば、ステージ プロパティを設定する前にこのコード行が呼び出されたり、ステージが利用できないなどです。ステージに割り当てられます (独自のクラスの小道具に同じ名前を使用することについて私が言った理由がわかりましたか?) 繰り返しますが、DisplayObject のステージ プロパティが使用可能になる前に (コンテンツがステージに追加されない)、コードが実行される可能性があります。クラスは null でないかどうかをチェックしません。

あなたが表示したコードのサンプルは、「シングルトン」に似たクラスでさえ、適切なシングルトンクラスではありません。

今解決策:

  • コード設計を見直して変更し、設計パターンについて読んでください (少なくともシングルトンの場合)。
  • プロパティが設定されているかどうか、いつ設定されたかを確認できるように、StyleManager でステージ値をトレースします。ズーム コンストラクターでもトレースします。
  • 常に try catch ブロックを使用するか、少なくともコードが依存するオブジェクトの存在をテストします

次のように:

if(stage) 
{
    stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseZoom);
}
else
{
    trace("[!] Expected stage but got null");
}

また

try
{
    stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseZoom);
}
catch(err:*)
{
    trace("[!] Expected stage but got null\n"+err);
}
  • 混乱を避け、デバッグを容易にするために、独自のクラスで ActionScript API が使用するのと同じ名前を使用しないでください:)
  • ステージ プロパティが null ではないことに依存している場合は、次のスニペットを使用します。

これは、FlashDevelop が新しい Main クラスを生成するのとまったく同じであり、非常にうまく機能します。

if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init, false, int.MAX_VALUE, true);

および初期化ハンドラー

protected function init(e:Event = null):void
{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    //do here whatever is needed when stage proeprty is NOT null
}

よろしくお願いします

于 2012-06-28T08:54:04.317 に答える
0

質問は古いかもしれませんが、最近同様の問題がありました.TLFの経験が浅いために非常に困惑していましたが、TLFは廃止されましたが、相互に流れ込む可能性のあるテキストフィールドを使用する必要があります.フラッシュを使用しています。そのため、このために CS6 を使用できることをうれしく思います。

とにかく、私の解決策は、コンストラクターからイベントリスナーを削除し、最初のフレームのタイムラインに配置することでした。ステージがロードされ、すべてが機能します-正しく機能するのに十分なほど深く理解していなかったことで傷ついた私のプライドだけです.

私は常にコンストラクターが最初に実行されると想定していました。これまでステージにイベントを割り当てる際に問題が発生したことはありませんでした。

これは、TLF コンポーネントをロードすると、ステージのロードに遅延が生じるためでしょうか? ステージが先で、その子であるすべてがその後に来るのでしょうか?狂気!

于 2015-05-10T20:34:54.073 に答える