ActionScript から mx:Canvas を参照しようとすると、オブジェクト参照が null になるのはなぜですか?
-
26-09-2019 - |
質問
これはからのフォローアップの質問です これです, コメントを投稿し続けて、人々が苦労して獲得した評判を妨げたくありません...:)
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を持つオブジェクトのハンドルを取得したい myCanvas
で main.mxml
を使用して myCanvas
中のオブジェクト MyCommand.as
解決
あなたのmyCanvas変数のスコープとは何ですか?それは方法のどこか内か?あなたはそれを公開するか、ゲッター/セッターそれにアクセスできるようにするために提供する必要があります。
また、それは、addChild()メソッドを使用して、その親に追加された前にそれを参照しようとしています。
があり、実際に問題を決定するために、あなたの例では十分なコードではありませんが、これらの事を見て開始するどこかを与える必要があります。
他のヒント
は、物事のカップルだろう。まず、あなたは「新しい」文の後にクラス名に括弧が必要ですnew MyCanvas();
第二には、あなたがそうするためにコンポーネントのライフサイクルの準備が整う前に、あなたのサブコンポーネントにアクセスしようとすることができます。 (それは十分なコンテキストが存在しないので、あなたが投稿したコードから伝えるのは難しいです。)
1つの方法は、
あなたのmyCanvasでのcreationComplete後に準備されますときのEventListenerを追加すると、すべてのものを行うことです、2番目は次のとおりです。 あなたのコンポーネントの初期ステージ上でアクセスできるようになりますので、myCanvasクラスのように、のサブオブジェクトあなたのを定義します。
よろしく ユージン
p.s。すべての時間の中で、誰もが自分の問題のほか形成された試料ずに答えを取得したい、その恐ろしい!!