Pourquoi mon null référence d'objet lorsque vous essayez de référencer un mx: Canvas à partir d'ActionScript?

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

Question

est une question de suivi celui-ci , je ne veux pas continuer dans les commentaires et empêcher les gens d'obtenir la réputation durement gagné ...:)

Dans ma classe de commande Cairngorm, pour le compiler je avais besoin de lui dire ce que myCanvas était, donc je cette ligne:

var myCanvas : MyCanvas = new MyCanvas;

Je suppose que cela est faux, cependant, parce que bien qu'il compile, si j'essaie de faire quelque chose comme ceci:

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

il va lancer cette erreur:

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

comme si le sous-objet n'existe pas. On dirait que je pourrais obtenir une nouvelle instance de MyCanvas, pas l'instance que je veux de l'main.mxml avec un id de myCanvas. Ai-je raison? Comment puis-je résoudre ce problème?

Modifier (22h59 GMT + 1): Ok, donc il semble que je suis trop vague ici. Voici mon 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>

Et voici mon 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");
      }
        }
    }
}

En fait, je veux obtenir une poignée sur l'objet avec ID myCanvas dans main.mxml en utilisant l'objet myCanvas dans MyCommand.as

Était-ce utile?

La solution

Quelle est la portée de votre variable myCanvas? Est-ce à l'intérieur d'une méthode quelque part? Vous aurez besoin de le rendre public ou lui donner getter / setter pour pouvoir y accéder.

Vous pouvez également essayer de faire référence avant qu'il a été ajouté à sa mère, en utilisant la méthode addChild ().

Il est vraiment le code ne suffit pas dans vos exemples pour déterminer le problème, mais ces choses devrait vous donner un endroit pour commencer à chercher.

Autres conseils

Peut-être deux ou trois choses. , Vous devez d'abord entre parenthèses sur le nom de votre classe après la mention « nouveau »: new MyCanvas(); Deuxièmement, vous pouvez essayer d'accéder à votre sous-composant avant le cycle de vie composant est prêt à vous de le faire. (Il est difficile de dire à partir du code affiché car il n'y a pas assez de contexte).

1 façon est d'ajouter eventListener lorsque vos myCanvas seront prêts après creationComplete et de faire tous vos trucs

et la seconde est la suivante: définir votre Subobject comme dans la classe myCanvas de sorte que vous serez en mesure d'accéder sur Init étape de votre composant.

concerne Eugene

p.s. tout le temps que tout le monde veulent obtenir une réponse sans échantillon bien formé de leur problème, ses terribles !!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top