ActionScript から mx:Canvas を参照しようとすると、オブジェクト参照が null になるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/3612553

質問

これはからのフォローアップの質問です これです, コメントを投稿し続けて、人々が苦労して獲得した評判を妨げたくありません...:)

Cairngorm コマンド クラスでは、コンパイルするために myCanvas が何であるかを伝える必要があるため、次の行を使用しました。

var myCanvas : MyCanvas = new MyCanvas;

ただし、これは間違っていると思います。なぜなら、次のようなことをしようとすると、コンパイルは完了します。

if (myCanvas.subObject.value == 0) { ... }

このエラーがスローされます:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at com.foo.bar.command::MyCommand/execute()

サブオブジェクトが存在しないかのように。myCanvas の ID を持つ main.mxml から必要なインスタンスではなく、MyCanvas の新しいインスタンスを取得しているようです。私は正しいですか?これを修正するにはどうすればよいですか?

編集 (GMT+1 午後 10 時 59 分): さて、ここではあまりにも漠然としすぎたようです。これが私の main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:control="com.foo.bar.control.*" 
    xmlns:business="com.foo.bar.business.*"
    xmlns:view="com.foo.bar.view.*"
    applicationComplete="com.foo.bar.util.StartupUtil.init()"
    horizontalScrollPolicy="off"
    verticalScrollPolicy="off"
    borderThickness="0"
    paddingBottom="0"
    paddingLeft="0"
    paddingTop="0"
    paddingRight="0"
>
    <mx:Script>
        <![CDATA[
            import com.foo.bar.model.PlayerModelLocator;

            [Bindable]
            private var model : PlayerModelLocator = PlayerModelLocator.getInstance();
        ]]>
    </mx:Script>

    <!-- ========================================================================== -->

        <!-- the ServiceLocator where we specify the remote services -->
        <business:Services id="services" />

        <!-- the FrontController, containing Commands specific to this application -->
        <control:PlayerController id="controller" />

    <!-- ========================================================================== -->

  <mx:Style source="assets/main.css" />
  <view:MyCanvas id="myCanvas" /> 

</mx:Application>

そして、これが私のものです com/foo/bar/command/MyCommand.as:

package com.foo.bar.command {
    /* add to controller
    addCommand( MyEvent.EVENT_CHANGE_VOLUME, ChangeVolumeCommand );
    */
    import flash.net.SharedObject;
    import com.adobe.cairngorm.control.CairngormEvent;
    import com.adobe.cairngorm.commands.ICommand;

    import com.foo.bar.model.PlayerModelLocator;
    import com.foo.bar.event.MyEvent;
    import com.foo.bar.view.*;

    public class ChangeVolumeCommand implements ICommand {
        public function execute(event:CairngormEvent):void {
      var model : PlayerModelLocator = PlayerModelLocator.getInstance();
      var myEvent : MyEvent = MyEvent(event);
      var myCanvas : MyCanvas = new MyCanvas();
      var so:SharedObject = SharedObject.getLocal("fixie.video");
      if (myCanvas.subObject.value == 0) {
        trace("subobject value is 0");
      }
        }
    }
}

基本的に、IDを持つオブジェクトのハンドルを取得したい myCanvasmain.mxml を使用して myCanvas 中のオブジェクト MyCommand.as

役に立ちましたか?

解決

あなたのmyCanvas変数のスコープとは何ですか?それは方法のどこか内か?あなたはそれを公開するか、ゲッター/セッターそれにアクセスできるようにするために提供する必要があります。

また、それは、addChild()メソッドを使用して、その親に追加された前にそれを参照しようとしています。

があり、実際に問題を決定するために、あなたの例では十分なコードではありませんが、これらの事を見て開始するどこかを与える必要があります。

他のヒント

は、物事のカップルだろう。まず、あなたは「新しい」文の後にクラス名に括弧が必要ですnew MyCanvas();第二には、あなたがそうするためにコンポーネントのライフサイクルの準備が整う前に、あなたのサブコンポーネントにアクセスしようとすることができます。 (それは十分なコンテキストが存在しないので、あなたが投稿したコードから伝えるのは難しいです。)

1つの方法は、

あなたのmyCanvasでのcreationComplete後に準備されますときのEventListenerを追加すると、すべてのものを行うことです

、2番目は次のとおりです。 あなたのコンポーネントの初期ステージ上でアクセスできるようになりますので、myCanvasクラスのように、のサブオブジェクトあなたのを定義します。

よろしく ユージン

p.s。すべての時間の中で、誰もが自分の問題のほか形成された試料ずに答えを取得したい、その恐ろしい!!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top