2009-11-25 22 views
5

Ho un swf che carica un swf esterno. Il swf del caricatore ha una variabile a cui voglio accedere dallo swf caricato. Io lo uso MovieClip(parent.parent).myVar ma restituisce questo erroreCome accedere alla variabile genitore clip mobile da swf caricato

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

il file SWF pala ha una consuetudine Classe documento che credo sia il problema.

Grazie in anticipo.

EDIT

Questo è il come del SWF principale

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); 
     } 

    } 
} 

e sto cercando di accedere alla variabile di prova dal SWF caricato con questo codice

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

EDIT # 2

Se I addChild(loader) non è nella onCardInit ma nel onViewClick e nel primo frame del swf caricato ho funziona ... ma perché non vuole essere all'interno della funzione onCardInit?

+0

quale sta generando null - parent o parent.parent? – Amarghosh

+0

parent.parent sta lanciando null – chchrist

+0

cosa ottieni per 'trace (parent); - qual è il suo tipo di dati? – Amarghosh

risposta

2

Avete un solo loader variabile e si sta creando quattro Loader istanze e assegnando ad esso - quindi se facendo clic su tutti e quattro in rapida successione, la variabile loader conterrà effettivamente l'oggetto Loader corrispondente all'ultimo clic. Tutti i vostri addChild chiamate agiranno su quello stesso Loader oggetto - non verranno aggiunti gli altri ei loro genitori continueranno ad essere null

Apportare le seguenti modifiche al codice:

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); 
} 

risposta alla seguente aggiornamento nella domanda:

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?

Anche in questo caso, che potrebbe essere perché si sta aggiungendo un altro oggetto loader - stai fa clic su più di un viewbuttons? Fare clic su un pulsante di visualizzazione e attendere fino a quando non viene caricato per vederlo funzionare.

+0

Sì, sono d'accordo ma il mio vero problema ora è come accedere dal swf caricato alla variabile testVar. – chchrist

+0

Dove stai cercando di accedervi? dal costruttore della classe di documenti? gestore di eventi? classe del pulsante? - Penso che qualche codice possa aiutare – Amarghosh

+0

dal primo frame dello swf caricato – chchrist

0

provate a tracciare genitore e parent.parent, io sono sicuro che sia a causa di un "genitore" adizionale

2

parent.parent è errato. provare a utilizzare:

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

Dovete lanciare il primo genitore a qualche classe come MovieClip e quindi ottenere genitore di questa nuova MovieClip e poi entrare dentro variabile.

0

loader.content NON è un Movie Clip, quindi non ha le stesse funzionalità. prova

myLoadedClip: MovieClip = MovieClip (loader.content);

allora la vostra myLoadedClip.parent.myVar dovrebbe apparire

si potrebbe desiderare il tuo gestore per il fuoco su un evento.COMPLETA anziché su Event.INIT

0

Questo solo codice di linea in swf caricato lo risolve! ;)

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