2009-11-25 14 views
5

私は外部swfを読み込むSWFを持っています。ローダーswfには、ロードされたswfからアクセスしたい変数があります。私はMovieClip(parent.parent).myVar使用しますが、それは読み込まれたswfから親ムービークリップの変数にアクセスするには

TypeError: Error #1009: Cannot access a property or method of a null object reference. at card01_fla::MainTimeline/frame1()

ローダSWFは、私が問題だと思うのカスタムドキュメントクラスを持っているこのエラーを返します。

ありがとうございます。

EDITこれはメインSWF

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 

    /** 
    * ... 
    * @author chchrist 
    */ 
    public class CardSender extends Sprite 
    { 

     private var loader:Loader; 
     private var viewButtonArray:Array; 
     private var sendButtonArray:Array; 
     private var cardContainer:Sprite; 

     public var testVar:String 

     public function CardSender() { 

      testVar = "it worked!!!"; 
      init(); 
     } 

     private function init() { 
      viewButtonArray = [cardsenderMC.view01, cardsenderMC.view02, cardsenderMC.view03, cardsenderMC.view04]; 

      for each(var viewButton in viewButtonArray) { 
       viewButton.buttonMode = true; 
       viewButton.addEventListener(MouseEvent.CLICK, onViewClick); 
      } 
     } 

     private function onViewClick(e:MouseEvent):void { 
      var cardName = "card"+e.target.name.substring(4)+".swf"; 
      loader = new Loader(); 
      loader.load(new URLRequest(cardName)); 
      loader.contentLoaderInfo.addEventListener(Event.INIT, onCardInit); 
     } 

     private function onCardInit(e:Event):void { 
      addChild(loader); 
      var content:* = loader.content; 
      content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
     } 

     private function onCloseClick(e:MouseEvent):void { 
      removeChild(loader); 
     } 

    } 
} 

のようであり、私はこのコード

trace(MovieClip(parent.parent).testVar); 

にロードされたSWFからのテスト変数にアクセスしようとしています

EDIT#2

もし私がaddChild(loader)にonCardInitではなく、onViewClickとロードされたswfの最初のフレームに私はObject(parent.parent).testVarを持っていますが、なぜそれはonCardInit関数の中にいないのですか?もしそうなら -

+0

どちらがnull - parentまたはparent.parentをスローしていますか? – Amarghosh

+0

parent.parentはnullを投げています – chchrist

+0

'trace(parent); - そのデータ型は何ですか? – Amarghosh

答えて

2

のだと確信していますし、あなたが4つのLoaderインスタンスを作成し、それに割り当てている親とparent.parentはをトレースしてみてください4つすべてをすばやく連続してクリックすると、loader変数には、最後のクリックに対応するLoaderオブジェクトが効果的に含まれます。すべてのあなたのaddChildの呼び出しは、同じLoaderオブジェクトに作用します - 他の人が追加されず、彼らの両親は、コードを次のように変更しますnull

であり続けるだろう。次の更新まで

private function onCardInit(e:Event):void 
{ 
    addChild(LoaderInfo(e.currentTarget).loader); 
    var content:DisplayObject = loader.content; 
    trace(content); 
    trace(content.closeButton); 
    content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
} 

private function onCloseClick(e:MouseEvent):void 
{ 
    trace(e.currentTarget);//should be the closeButton 
    trace(e.currentTarget.parent);//should be the loaded swf 
    trace(e.currentTarget.parent.parent);//should be the Loader object that loaded it 

    //The following will work only if last three traced correctly 
    removeChild(e.currentTarget.parent.parent); 
} 

回答

質問に:再び

If I addChild(loader) in the onViewClick instead of onCardInit , then Object(parent.parent).testVar in the first frame of the loaded swf works. Why doesn't it work if I addChild inside the onCardInit function?

、あなたは別のloaderオブジェクトを追加しているので、それはあるかもしれない - あなたは、複数のviewbuttonsをクリックしていますか?ビューボタンをクリックし、表示されるまで待ちます。

+0

はい私は同意しますが、私の本当の問題は、ロードされたswfからtestVar変数にアクセスする方法です。 – chchrist

+0

どこにアクセスしようとしていますか?ドキュメントクラスのコンストラクタから?イベントハンドラ?ボタンクラス? - 私はいくつかのコードは、ロードされたswfの最初のフレームから – Amarghosh

+0

を助けると思う。 – chchrist

0

は、私はちょうど1 loader変数あなたが持っている、それが原因でaditional「親」

2

parent.parentが間違っています。 使用してみてください:

MovieClip(MovieClip(e.currentTarget.parent).parent).myVar ; 

あなたはMovieClipのようないくつかのクラスへの最初の親をキャストして、この新しいムービークリップの親を取得し、変数の内部で取得する必要があります。

0

loader.contentはムービークリップではないため、同じ機能はありません。試してみてください

myLoadedClip:MovieClip = MovieClip(loader.content);

、あなたのmyLoadedClip.parent.myVarはあなたのハンドラがイベントに発砲する場合があります

表示されるはずです。COMPLETEの代わりにEvent.INIT

0

ロードされたSWFのこの唯一のラインコードは、それを解決します! ;)

MovieClip(MovieClip(parent.parent).root).play();

関連する問題