Perché il mio nulla riferimento all'oggetto quando si cerca di fare riferimento a un mx: Canvas da ActionScript?

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

Domanda

Questo è un follow-up domanda da questo , non voglio andare avanti nei commenti e impedendo alle persone di ottenere la reputazione sudati ...:)

Nella mia classe di comando Cairngorm, per farlo compilare avevo bisogno di indicare cosa MyCanvas era, così ho usato questa linea:

var myCanvas : MyCanvas = new MyCanvas;

Sto indovinando che è sbagliato, però, perché anche se si compila, se provo a fare qualcosa di simile:

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

che sarà gettare questo errore:

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

come se il sotto-oggetto non esiste. Sembra che io possa essere sempre una nuova istanza di MyCanvas, non l'istanza che voglio dalla main.mxml con un ID di MyCanvas. Ho ragione? Come posso risolvere questo problema?

Modifica (22:59 GMT + 1): Va bene, in modo che appaia come se fossi stato troppo vaga qui. Ecco il mio 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>

Ed ecco il mio 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");
      }
        }
    }
}

In sostanza, voglio ottenere una maniglia sul oggetto con ID myCanvas nel main.mxml utilizzando l'oggetto myCanvas in MyCommand.as

È stato utile?

Soluzione

Qual è la portata della variabile MyCanvas? E 'all'interno di un metodo da qualche parte? Sarà necessario renderlo pubblico o dare getter / setter per essere in grado di accedervi.

Si può anche tentare di fare riferimento prima che è stato aggiunto al suo genitore, utilizzando il metodo addChild ().

non è davvero sufficiente il codice nei tuoi esempi per determinare il problema, ma queste cose dovrebbe darvi qualche parte per iniziare la ricerca.

Altri suggerimenti

Potrebbe essere un paio di cose. In primo luogo, è necessario parentesi sul nome della classe dopo l'istruzione "nuovo": new MyCanvas(); In secondo luogo, si può tentare di accedere al tuo componente sub prima che il ciclo di vita del componente è pronto per voi a farlo. (E 'difficile dire dal codice che hai postato dal momento che non c'è abbastanza contesto.)

1 modo è quello di aggiungere eventListener quando i vostri MyCanvas saranno pronte dopo creationComplete e di fare tutte le tue cose

e la seconda è: definire il sotto-oggetto , come in classe MyCanvas in modo sarete in grado di accedere a Init fase del componente.

saluti Eugene

P.S. tutto il tempo ognuno vuole ottenere risposta senza campione ben formato del loro problema, la sua terribile !!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top