2009-11-25 5 views
5

Tengo un swf que carga un swf externo. El swf del cargador tiene una variable a la que quiero acceder desde el swf cargado. Yo uso MovieClip(parent.parent).myVar pero vuelvo este errorCómo acceder a la variable del MovieClip principal desde swf cargado

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

el SWF cargador tiene una costumbre Clase de documento que creo que es el problema.

Gracias de antemano.

EDITAR

Este es el tan del SWF principal

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

    } 
} 

y yo estoy tratando de acceder a la variable de prueba desde el SWF cargado con este código

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

EDITAR # 2

Si addChild(loader) no está en onCardInit pero en onViewClick y en el primer fotograma del swf cargado tengo Object(parent.parent).testVar funciona ... pero ¿por qué no quiere estar dentro de la función onCardInit?

+0

¿cuál está arrojando null - parent o parent.parent? – Amarghosh

+0

parent.parent arroja nulo – chchrist

+0

¿Qué obtienes por 'trace (parent); - ¿Cuál es su tipo de datos? – Amarghosh

Respuesta

2

Sólo le falta un loader variable y va a crear cuatro casos Loader y asignándolos a él - por lo que si Si hace clic en los cuatro en una sucesión rápida, la variable loader contendrá efectivamente el objeto Loader correspondiente al último clic. Todos sus addChild llamadas actuarán sobre ese mismo Loader objeto - no se añadirán a los otros y sus padres seguirán siendo null

Realiza los siguientes cambios en el código:

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

respuesta a la siguiente actualización en la pregunta:

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?

una vez más, eso podría ser porque va a añadir un objeto diferente loader - estás haciendo clic en más de un viewbuttons? Haga clic en un botón de vista y espere hasta que se cargue para verlo funcionar.

+0

Sí, estoy de acuerdo, pero mi verdadero problema ahora es cómo acceder desde el swf cargado la variable testVar. – chchrist

+0

¿Dónde intentas acceder? del constructor de la clase de documento? ¿controlador de eventos? ¿clase de botón? - Creo que algún código ayudaría a – Amarghosh

+0

desde el primer fotograma del swf cargado – chchrist

0

try rastreo de los padres y parent.parent, estoy seguro de que es debido a un "padre" Adicional

2

parent.parent está mal. trate de usar:

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

Tienes que tirar la primera matriz en cierta clase como clip de película y luego los padres de este nuevo clip de película y luego conseguir el interior variable.

0

loader.content NO es un clip de película, por lo que no tiene las mismas capacidades. intente

myLoadedClip: MovieClip = MovieClip (loader.content);

entonces su myLoadedClip.parent.myVar debe aparecer

es posible que desee que su manejador al fuego en un Evento.COMPLETE en lugar de hacerlo en un Event.INIT

0

¡Este único código de línea en swf cargado lo resuelve! ;)

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

Cuestiones relacionadas