0

別々のシーンに分かれているFlashプロジェクトに取り組んでいます。

シーン1には、複数のMovieClipsがあります(RESIZE(およびその他)のイベントリスナーが含まれています)。

シーン2には、いくつかの一般的なMovieClipsと新しいもの(RESIZE(およびその他)のイベントリスナーも含まれています)があります。

シーン1のボタンをクリックしてシーン2に移動した後、ステージのサイズを変更して次のエラーが発生する場合を除いて、問題ありません。

TypeError: Error #1009: Cannot access a property or method of a null object reference.

イベントリスナーに関連していることは知っていますが、多くのリスナーが予想されるため、それぞれを個別に削除するのは非現実的です。

4

2 に答える 2

2

私があなたの状況を正しく理解していれば、最終的には各リスナーを個別に削除するか、サイズ変更リスナーを1回だけ追加する必要があると思います。シーンについておっしゃっていましたが、タイムラインで作業していると思いますか?また、nullオブジェクト参照エラーは、ステージから削除されたシーン、存在しなくなった表示オブジェクトへの参照、シーンが削除された後のステージへの参照、または関数の呼び出しに起因すると想定しています(存在しなくなったオブジェクトのサイズ変更ハンドラー)。

これに対処するいくつかの方法は次のとおりです。

  1. リスナーハンドラー関数にチェックを追加します

    if(!this.stage)return

    エラーを回避するためですが、関数がメソッドであるオブジェクトが削除されている場合は役に立ちません。

  2. 何百ものリスナーを削除することを忘れないようにするには、removeAllListeners関数とaddCustomEventListener関数を作成します。通常のaddEventListenerの代わりに、addCustomEventListenerを呼び出します。これにより、addEventListenerが呼び出されます。addCustomListenerに、ターゲット、リスナー関数、およびイベント文字列をディクショナリまたはオブジェクトの配列に格納させます。removeAllListenersは、ディクショナリまたは配列をループして、すべてのリスナーを削除できます。これは、イベントハブを設定するのと少し似ていますが、それほど遠くはありません。

  3. RESIZEイベントリスナーを各シーンに追加する代わりに、一度だけ追加します。次に、リスナー関数で、アクティブなシーンまたはビューのいずれかのシーンで関数を呼び出します。この最後のアプローチは、私が最も頻繁に見たアプローチであり、最も強力な証拠です。タイムラインに実装するのは難しいかもしれません。私は常にタイムラインの変数スコープについて少しぼんやりしてきました。

于 2012-07-02T17:08:52.750 に答える
1

はい、私が知る限り、これを行うための適切な自動化された方法はありませんが、オブジェクトに適切なリスナーを手動で追加および削除するregisterAllListenersメソッドとremoveAllListenersメソッドを作成することをお勧めします。

于 2012-07-02T16:48:43.107 に答える